UserControl菜单上的多级数据绑定相互依赖

时间:2016-10-22 17:05:29

标签: c# wpf xaml data-binding datacontext

enter image description here

我有一个属性Tours

  • ToursObservableCollectionTour
    • 每个“Tour”都有ObservableCollection Parties个班级Partie
      • 每个Partie都有一个ObservableCollection EquipesEquipe

我有3个菜单:

  1. 第一个是与属性Tours
  2. 绑定
  3. 第二个必须与第一个菜单SelectedItem属性绑定(因此它有一个ObservableCollectionPartie
  4. 第三个必须与第二个菜单的SelectedItem属性绑定。 (因此它有ObservableCollectionEquipes
  5. 现在,这是工作代码:

    <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)之间设置lvMenuMenuUserControl内。我觉得这样做很简单:

    <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中的ListViewMenuUserControl)有ItemsSource="{Binding}"将其绑定到上下文。

    有没有人知道如何做到这一点? (对不起我的英文)

1 个答案:

答案 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;
        }
    }

主要优点是此代码可测试且可扩展。

希望这有帮助。