我有一个属性Tours
:
Tours
是ObservableCollection
班Tour
ObservableCollection
Parties
个班级Partie
Partie
都有一个ObservableCollection
Equipes
类Equipe
我有3个菜单:
Tours
SelectedItem
属性绑定(因此它有一个ObservableCollection
类Partie
) SelectedItem
属性绑定。 (因此它有ObservableCollection
类Equipes
) 现在,这是工作代码:
<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
,我似乎无法在菜单和databinding
(我命名为ListView
)之间设置lvMenu
在MenuUserControl
内。我觉得这样做很简单:
<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}" />
...
lvMenu
中的ListView
(MenuUserControl
)有ItemsSource="{Binding}"
将其绑定到上下文。
有没有人知道如何做到这一点? (对不起我的英文)
答案 0 :(得分:0)
一种方法是在usercontrol中使用DependencyProperty
另一种简单的方法是
为MenuTours用户控件创建ViewModel
在MenuTours中,ListViews将selectedItem与ViewModel中的属性绑定为TwoWayBinding
现在在您的主窗口中订阅MenuToursViewModel的propertyChanged事件
MenuToursViewModel.PropertyChanged += OnpropertyChanged;
void OnPropertyChanged(Sender s, PropertyChangedEventArgs e)
{
if(e.PropertyName == "SelectedTour")
{
MenuPartiesViewModel.Items = SelectedTour.parties;
}
}
主要优点是此代码可测试且可扩展。
希望这有帮助。