Question

J'ai un simple UserControl contenant Label, ComboBox et Button. En résumé, il doit être utilisé plusieurs fois dans presque la totalité de mes vues, chaque fois qu’il est fourni avec différents éléments ItemsSource et CreateItemCommand à l’aide de la liaison à mes propriétés ViewModel.

Label et ComboBox font partie d’un autre UserControl (LabeledComboBox) qui fonctionne parfaitement.

Le problème est que, lorsque j'essaie de lier une commande dans une fenêtre contenant mon UserControl, j'obtiens l'exception suivante:

  

Une "liaison" ne peut pas être définie sur la propriété "CreateItemCommand" de type "MutableComboBox". Une 'liaison' ne peut être définie que sur un DependencyProperty d'un DependencyObject.

Voici le XAML pour 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>

Voici le code ci-dessous pour cela:

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
}

Comme vous pouvez le constater, j’utilise deux méthodes différentes pour enregistrer mes points de détection: ItemsSource est extrait de ItemsControl DP et CreateItemCommand est créé par DependencyProperty.Register (...). J'ai essayé d'utiliser Button.CommandProperty.AddOwner (...) mais j'ai eu la même exception.

Voici comment j'essaie de lier:

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

Le DataContext de la fenêtre est défini sur ViewModel approprié, qui fournit une ObservableCollection of Recipients et une ICommand CreateNewRecipient sous forme de propriétés simples.

Qu'est-ce que je fais mal? La seule chose que je veux dans ce cas particulier est d'exposer une propriété Button.Command pour une utilisation en dehors de mon UserControl, tout comme pour le ItemsSource. Est-ce que j'essaie d'utiliser les commandes dans le mauvais sens? Comment puis-je lier des commandes de mes contrôles utilisateur à partir d'autres contrôles ou fenêtres?

Considérez-moi comme un newb avec ce type de commande et de dépendance. Toute aide serait appréciée. Googlé toute la nuit et n'a rien trouvé utilisable dans mon cas. Pardon mon anglais.

Était-ce utile?

La solution

Vous avez enregistré un nom incorrect pour votre propriété de dépendance. Ce devrait être:

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

Notez que la chaîne est " CreateItemCommand " ;. Vous devez lire cette documentation MSDN pour obtenir des informations détaillées sur les conventions de propriétés de dépendance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top