2011-02-03 3 views
1

J'ai un ListBox où j'utilise un UserControl en tant que DataTemplate. Mon UserControl a un ViewModel. J'ai un DependencyProperty dans mon UserControl afin que je puisse lier l'élément de ma ListBox à mon UserControl.DependencyProperty pour UserControl avec DataContext

Cela ne fonctionne pas à moins que je ne mette pas de DataContext à mon UserControl. Comment puis-je utiliser DP et DataContext personnalisé dans mon UC?

Mon ListBox:

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

Mon UserControl 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> 

Mon 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(); 
     } 
     ... 
    } 

classe d'objet dans ItemSource de ListBox:

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

Qu'est-ce que j'ai fait de mal?

Répondre

1

Vous définissez le DataContext dans le MyCustomUC()
à la place que vous pouvez définir DataContext comme celui-ci

<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> 

vous devez inclure l'espace de noms

xmlns:vm="clr-namespace:YourViewModelPath" 
+1

mais la question est pourquoi la liaison le moteur utilise DataContext défini dans UserControl au lieu du DataContext du contrôle conteneur (dans ce cas généré par le contrôle ListBox)? pourquoi définir le DataContext dans XAML fonctionne différemment que dans le code? – serine

Questions connexes