2016-10-22 3 views
0

enter image description hereМногоуровневая привязка данных в меню UserControl зависят друг от друга

У меня есть свойство Tours:

  • Tours является ObservableCollection класса Tour
    • Каждый "Тур" имеет a ObservableCollectionParties класса Partie
      • Каждый Partie имеет ObservableCollectionEquipes класса Equipe

У меня есть 3 меню:

  1. Первая является связь со свойством Tours
  2. Вторые должна быть связью с SelectedItem свойства первого меню (так что имеет ObservableCollection класса Partie)
  3. Третьи должна быть связь с 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

Вам нужен шаблон MVVM. дайте мне посмотреть – Coding4Fun

+0

Я не уверен, но возможно, что [сообщение в блоге] (http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html?m=1) может быть решением. Он передает «объект» через «DependencyProperty». Кажется, это сложнее, чем я. – maxeber

ответ

0

Одним из способов является DependencyProperty в UserControl

Другой простой способ

Создать ViewModel ибо MenuTours UserControl

В MenuTours Bind ListViews SelectedItem со свойством в ViewModel as TwoWayBinding

Теперь в вашем главном окне подпишитесь на propertyChanged событие MenuToursViewModel

MenuToursViewModel.PropertyChanged += OnpropertyChanged; 

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

Главное преимущество заключается в том, что этот код можно тестировать и масштабировать.

Надеюсь, это поможет.

Смежные вопросы