Frage

Ich habe ein einfaches Benutzersteuerelement enthält, Etikett, ComboBox und Button. Kurz gesagt, ist es in fast all meine Ansichten viele Male, jedes Mal geliefert mit verschiedenen Itemssource und CreateItemCommand mit Bindungen zu meinem Viewmodel Eigenschaften verwendet werden.

Die Label- und ComboBox ist Teil einer anderen Usercontrol (LabeledComboBox), die ganz gut funktioniert.

Das Problem ist, dass wenn ich versuche, einen Befehl in einem Fenster zu binden, dass mein Usercontrol enthält erhalte ich die folgende Ausnahme:

  

A ‚Bindung‘ kann nicht auf dem ‚CreateItemCommand‘ Eigenschaft des Typs ‚MutableComboBox‘ gesetzt werden. A 'Bindung' kann nur auf einem DependencyProperty eines DependencyObject eingestellt werden.

Hier ist die XAML für MutableComboBox:

<UserControl x:Class="Albo.Presentation.Templates.MutableComboBox"
x:Name="MCB"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:Albo.Presentation.Templates" >
<StackPanel Height="25" Orientation="Horizontal">
    <uc:LabeledComboBox x:Name="ComboBoxControl"
        Label = "{Binding ElementName=MCB, Path=Label}"
        ItemsSource="{Binding ElementName=MCB, Path=ItemsSource}"
        SelectedItem="{Binding ElementName=MCB, Path=SelectedItem}" />
    <Button x:Name="CreateItemButton"
        Grid.Column="1" Width="25" Margin="2,0,0,0"
        Content="+" FontFamily="Courier" FontSize="18" 
        VerticalContentAlignment="Center"
        Command="{Binding ElementName=MCB, Path=CreateItemCommand}"/>
</StackPanel>
</UserControl>

Hier ist der Code-Behind für sie:

public partial class MutableComboBox : UserControl
{
    public MutableComboBox()
    {
        InitializeComponent();
    }

    public string Label
    {
        get { return this.ComboBoxControl.Label; }
        set { this.ComboBoxControl.Label = value; }
    }

    #region ItemsSource dependency property
    public static readonly DependencyProperty ItemsSourceProperty =
        ItemsControl.ItemsSourceProperty.AddOwner(
            typeof(MutableComboBox),
            new PropertyMetadata(MutableComboBox.ItemsSourcePropertyChangedCallback)
        );

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public static void ItemsSourcePropertyChangedCallback(
        DependencyObject controlInstance,
        DependencyPropertyChangedEventArgs e)
    {
        MutableComboBox myInstance = (MutableComboBox)controlInstance;

        myInstance.ComboBoxControl.ItemsSource = (IEnumerable)e.NewValue;
    } 
    #endregion // ItemsSource dependency property

    #region SelectedItem dependency property
    // It has just the same logic as ItemsSource DP.
    #endregion SelectedItem dependency property

    #region CreateItemCommand dependency property

    public static readonly DependencyProperty CreateItemCommandProperty =
        DependencyProperty.Register(
            "MutableComboBoxCreateItemCommandProperty",
            typeof(ICommand),
            typeof(MutableComboBox)
        );

    public ICommand CreateItemCommand
    {
        get { return (ICommand)GetValue(CreateItemCommandProperty); }
        set { SetValue(CreateItemCommandProperty,value); }
    }

    #endregion // CreateItem dependency property
}

Wie Sie sehen können, verwende ich zwei verschiedene Ansätze, um meine DPs Registrierung: Itemssource von Items DP genommen wird und CreateItemCommand durch DependencyProperty.Register (...) erstellt. Ich habe versucht, Button.CommandProperty.AddOwner (...), aber hatte die gleiche Ausnahme zu verwenden.

Hier ist, wie ich versuche, zu binden:

<Window ...
    xmlns:uc="clr-namespace:Albo.Presentation.Templates">
    <uc:MutableComboBox Label="Combo" 
        ItemsSource="{Binding Path=Recipients}"
        CreateItemCommand="{Binding Path=CreateNewRecipient}"/>
</Window>

Der Datacontext des Fensters gesetzt Ansichtsmodell aneignen, die eine ObservableCollection von Empfängern und eine ICommand CreateNewRecipient als einfache Eigenschaften bereitstellt.

Was mache ich falsch? Das einzige, was ich in diesem speziellen Fall will, ist eine Button.Command Eigenschaft für den Einsatz außerhalb meines Usercontrol zu belichten, ebenso wie die Itemssource. Versuche ich Befehle in die falsche Art und Weise zu benutzen? Wie kann ich binden an Befehle meines Usercontrols von anderen Kontrollen oder Fenster?

Betrachten Sie mich ein newb mit diesem Befehl und DependencyProperty Sachen. Jede Hilfe wäre sehr geschätzt. die ganze Nacht gegoogelt und nicht alles verwendbar in meinem Fall finden. Verzeihen Sie mein Englisch.

War es hilfreich?

Lösung

Sie haben den falschen Namen für die Abhängigkeitseigenschaft registriert. Es sollte sein:

public static readonly DependencyProperty CreateItemCommandProperty =
        DependencyProperty.Register(
            "CreateItemCommand",
            typeof(ICommand),
            typeof(MutableComboBox)
        );

Beachten Sie die Zeichenfolge "CreateItemCommand". Sie sollten noreferrer"> dieser MSDN-Dokumentation für detaillierte Informationen zu den Konventionen durch

scroll top