DependencyProperty для UserControl с DataContext

У меня есть ListBox, где я использую UserControl как DataTemplate. Мой UserControl имеет ViewModel. У меня есть DependencyProperty в моем UserControl, так что я могу связать элемент из моего ListBox с моим UserControl.

Это не работает, если я не устанавливаю какой-либо DataContext в свой UserControl.

Как я могу использовать DP и пользовательский DataContext в своем UC?

Мой список:

<ListBox ItemsSource="{Binding Path=ListItems, Mode=TwoWay}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <local:MyCustomUC MyObject="{Binding Path=.}"/>
             </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Мой пользовательский контроль XAML:

<UserControl x:Class="UserControlDataTemplate.MyCustomUC"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Path=FromViewModel}" />
        <Button Content="{Binding ElementName=MyObject, Path=FromParent}" />
    </StackPanel>
</UserControl>

Мой пользовательский контроль CS:

       public MyClass MyObject
        {
            get { return (MyClass)GetValue(MyObjectProperty); }
            set
            {
                SetValue(MyObjectProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyObjectProperty =
        DependencyProperty.Register("MyObject", typeof(MyClass), typeof(MyCustomUC), new PropertyMetadata(null));

        public MyCustomUC()
        {
           InitializeComponent();

           this.DataContext = new MyCustomUCViewModel();
        }

My ViewModel:

    public class MyCustomUCViewModel : DependencyObject, INotifyPropertyChanged
    {
        public String FromViewModel { get; set; }

        public MyCustomUCViewModel()
        {
            this.FromViewModel = Guid.NewGuid().ToString();
        }
        ...
     }

Класс элемента в ItemSource из ListBox:

public class MyClass : INotifyPropertyChanged
{
    public String FromParent { get; set; }
    ...
}

Что я сделал не так ?


person Guillaume    schedule 03.02.2011    source источник


Ответы (1)


Здесь вы устанавливаете DataContext в MyCustomUC()
вместо этого вы можете установить DataContext следующим образом

<vm:YourViewModel x:Name="VModel" IfPropertToSet="{BindingFromExistingDC}"/>  

<ListBox ItemsSource="{Binding Path=ListItems, Mode=TwoWay}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <local:MyCustomUC MyObject="{Binding Path=.}" DataContext="{Binding ElementName=VModel}" />
             </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

вам нужно включить пространство имен

xmlns:vm="clr-namespace:YourViewModelPath"
person Binil    schedule 03.02.2011
comment
но вопрос в том, почему механизм привязки использует DataContext, установленный в UserControl, вместо DataContext содержащего элемента управления (в данном случае сгенерированного ListBox)? почему установка DataContext в XAML работает иначе, чем в коде? - person serine; 14.07.2011