2016-11-24 5 views
1

Ich möchte ein Userinterface wie folgt aus (ein Zeitplan für einen Video-Editor) enter image description hereC# Datenbindung verschachtelte Items wpf

und ich alle Klassen bauen:

public class Timeline 
    { 
     public Timeline() 
     { 
      groups = new ObservableCollection<Group>(); 
     } 
     public ObservableCollection<Group> groups { get; set; } 

    } 

public class Group 
{ 
    public string Name { get; set; } 

    public TrackGroup() 
    { 
     tracks = new List<Track>(); 
    } 

    public List<Track> tracks { get; set; } 
} 

public class Track 
{ 
    public Track() 
    { 
     units= new ObservableCollection<Unit>(); 
    } 
    public ObservableCollection<Unit> units { get; set; } 
} 

public class Unit 
{ 
    public string unitName { get; set; } 
} 

Und in Haupt Ich habe diese :

public Timeline timeline = new Timeline(); 
public Unit unit = new Unit(); 
public Track track = new Track(); 
public Group group = new Group(); 
track.units.Add(unit); 
group.tracks.Add(track); 
timeline.groups.Add(group); 

Und in Main.xaml (nicht vollständig, weil es nicht funktioniert)

<ListBox 
     HorizontalContentAlignment="Stretch" 
     ItemsSource="{Binding timeline.groups}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <DockPanel LastChildFill="True"> 
          <ItemsControl ItemsSource="{Binding timeline.groups.tracks}"> 
           <ItemsControl.ItemTemplate > 
            <ItemsControl ItemsSource="{Binding timeline.groups.tracks.units}"> 
             <ItemsControl.ItemTemplate > 
             </ItemsControl.ItemTemplate > 
            </ItemsControl> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl> 
         </DockPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Wie kann ich jede Itemquelle binden? weil timeline, gruppe, spur alle sind liste, also muss ich sie in ItemsControl zeigen. Ich war sehr verwirrt

Antwort

2

Sie müssen keinen vollständigen Pfad für Bindungen in inneren Listen verwenden.

Denn wenn Sie einige ItemControl und versuchen, binden es Artikel erinnern, Stil, dass jeder Artikel ist bereits ein Beispiel für Sammlung, die Sie als ItemsSource verwendet

Edit1:
Window.xaml.cs Datei:

Timeline timeline = new Timeline(); 
Unit unit1 = new Unit() {unitName = "1"}; 
Unit unit2 = new Unit() {unitName = "2"}; 
Track track = new Track(); 
Group group = new Group(); 
track.units.Add(unit1); 
track.units.Add(unit2); 
group.tracks.Add(track); 
timeline.groups.Add(group); 
list.DataContext = timeline; 

Hier habe ich VM nicht verwendet, wenn Sie VM verwenden möchten, fügen Sie es einfach zum Datenkontext Ihres Fensters hinzu und binden Sie die Liste an es. XAML:

<ListBox HorizontalContentAlignment="Stretch" 
      Name="list" 
      ItemsSource="{Binding groups}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <DockPanel LastChildFill="True"> 
        <ItemsControl ItemsSource="{Binding tracks}"> 
         <ItemsControl.ItemTemplate > 
          <DataTemplate> 
           <ItemsControl ItemsSource="{Binding units}"> 
            <ItemsControl.ItemTemplate> 
             <DataTemplate> 
              <TextBox Text="{Binding unitName}"/> 
             </DataTemplate> 
            </ItemsControl.ItemTemplate> 
           </ItemsControl> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </DockPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

nur Stil, getestet. Wenn Sie VM mit Timeline Eigenschaft verwenden, ändern Sie die Bindung an 'timelinePropertyName'.groups

Und lesen Sie mehr über Bindungen.

+0

Es funktioniert nicht von "binding timeline.groups". Ich benutze "datacontext = this" in der Hauptklasse, richtig? –

+0

Aktualisierte Antwort. – Shakra

0

Versuchen Sie, die entsprechenden Mitglieder kapitalisieren. WPF unterscheidet zwischen Groß- und Kleinschreibung.