2016-10-22 53 views
0

enter image description here多级数据绑定依赖对方

我有一个属性Tours

  • ToursTour
    • 每一个 “游” 的ObservableCollectionPartiesPartie
      • 每个Partie具有ObservableCollectionEquipesEquipe

的我有3个菜单:

  1. 首先是是键与属性Tours
  2. 第二必须键与所述第一菜单SelectedItem属性(因此具有Partie类的ObservableCollection
  3. 第三必须是键与所述第二菜单的SelectedItem属性。 (所以它有Equipes类的ObservableCollection

眼下,这是工作代码:

<StackPanel> 
    <ListView Name="lvTours" ItemsSource="{Binding Tours}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding Name}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ListView> 
    <ListView Name="lvParties" ItemsSource="{Binding ElementName=lvTours, Path=SelectedItem.Parties}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding Name}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ListView> 
    <ListView Name="lvEquipes" ItemsSource="{Binding ElementName=lvParties, Path=SelectedItem.Equipes}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding Name}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ListView> 
</StackPanel> 

然后我可以根据SelectedItem更改上下文的看法菜单:

<StackPanel Grid.Column="1"> 
    <local:StatistiquesTour DataContext="{Binding ElementName=lvTours, Path=SelectedItem}" /> 
    <local:StatistiquesParties DataContext="{Binding ElementName=lvParties, Path=SelectedItem}" /> 
    <local:StatistiquesEquipes DataContext="{Binding ElementName=lvEquipes, Path=SelectedItem}" />    
</StackPanel> 

我的问题是如果我的菜单变成Usercontrol ,我似乎无法在MenuUserControl内的菜单和ListView(即我命名为:lvMenu)之间创建databinding。我虽然这将是为做这样的事情非常简单:

<local:MenuUserControl x:Name="MenuTours" DataContext="{Binding Tours}" /> 
<local:MenuUserControl x:Name="MenuParties" DataContext="{Binding ElementName=MenuTours.lvMenu, Path=SelectedItem}" /> 
<local:MenuUserControl x:Name="MenuEquipes" DataContext="{Binding ElementName=MenuParties.lvMenu, Path=SelectedItem}" /> 

,然后选择上下文将到达同样的方式:

<local:StatistiquesTour DataContext="{Binding ElementName=MenuTours.lvMenu, Path=SelectedItem}" /> 
<local:StatistiquesParties DataContext="{Binding ElementName=MenuParties.lvMenu, Path=SelectedItem}" /> 
... 

lvMenuMenuUserControl(该ListView)有其ItemsSource="{Binding}"到将它绑定到上下文。

有没有人有线索如何做到这一点?(对不起,我的英语)

+0

您需要MVVM模式。让我看看 – Coding4Fun

+0

我不确定,但也许[博客文章](http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html?m=1)可能成为解决方案。它通过'DependencyProperty'传递一个'object'。这似乎比我想的要难。 – maxeber

回答

0

一种方法是的DependencyProperty在用户控件

另一种简单的方法是

创建一个视图模型为MenuTours用户控件

在MenuTours绑定列表视图将selectedItem在视图模型属性作为TwoWayBinding

现在在您的主窗口中订阅menuToursViewModel的propertyChanged事件

MenuToursViewModel.PropertyChanged += OnpropertyChanged; 

    void OnPropertyChanged(Sender s, PropertyChangedEventArgs e) 
    { 
     if(e.PropertyName == "SelectedTour") 
     { 
      MenuPartiesViewModel.Items = SelectedTour.parties; 
     } 
    } 

主要优点是这段代码是可测试和可扩展的。

希望这会有所帮助。