2016-10-22 3 views
0

enter image description hereMulti-Level-Datenbindung auf Usercontrol Menü voneinander abhängig

habe ich eine Eigenschaft Tours:

  • Tours ist ein ObservableCollection der Klasse Tour
    • Jede "Tour" hat eine ObservableCollectionParties der Klasse Partie
      • Jeder Partie hat eine ObservableCollectionEquipes der Klasse Equipe

Ich habe 3 Menüs:

  1. Die erste ist eine Bindung mit der Eigenschaft Tours
  2. die zweite Bindung mit der SelectedItem Eigenschaft des ersten Menüs sein muss (so hat es ein ObservableCollection der Klasse Partie)
  3. Die dritte muss Bindung sein mit der SelectedItem Eigenschaft des zweiten Menüs. (so hat es ein ObservableCollection der Klasse Equipes)

Gerade jetzt, das ist der Arbeitscode:

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

Und dann kann ich den Blick auf den Kontext auf dem SelectedItem je ändern der Menüs:

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

Mein Problem ist, wenn meine Menüs Usercontrol werden , Ich kann nicht scheinen, die databinding zwischen dem Menü und ListView (die ich nannte: lvMenu) innerhalb der MenuUserControl. Ich dachte, es wäre so einfach sein wie so etwas wie dies zu tun:

<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}" /> 

Und dann würde der Kontext die gleiche Art und Weise erreichbar sein:

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

Die lvMenu (die ListView) in MenuUserControl hat seine ItemsSource="{Binding}" zu Binde es an den Kontext.

Hat jemand eine Ahnung, wie man das macht?(Sorry für mein Englisch)

+0

Sie benötigen MVVM-Muster. Lass mich sehen – Coding4Fun

+0

Ich bin mir nicht sicher, aber vielleicht könnte das [Blog-Post] (http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html?m=1) möglicherweise sei die Lösung. Er übergibt ein 'Objekt' durch' DependencyProperty'. Es scheint, es ist schwieriger als das, was ich dachte. – maxeber

Antwort

0

Eine Möglichkeit ist DependencyProperty in der Usercontrol

Eine weitere einfache Möglichkeit ist

ein Ansichtsmodell erstellen für die MenuTours Usercontrol

In MenuTours Bind Listviews selectedItem mit einer Eigenschaft in Ansichtsmodell als TwoWayBinding

Jetzt in Ihrem Hauptfenster subscribe Eigenschaft von MenuToursViewModel

abonnieren
MenuToursViewModel.PropertyChanged += OnpropertyChanged; 

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

Der Hauptvorteil ist, dass dieser Code testbar und skalierbar ist.

Hoffe, das hilft.

Verwandte Themen