2016-11-24 194 views
1

我想建立這樣一個的UserInterface(用於視頻編輯時間軸) enter image description hereC#數據綁定嵌套的ItemsControl WPF

,我有所有的類:

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

而且在主要我有這:

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

而且在Main.xaml(不完整的,因爲它不工作)

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

如何綁定每個itemssource?因爲時間軸,,軌道所有列表,所以我需要在ItemsControl中顯示它們。我很困惑

回答

2

對於內部列表中的綁定,您不需要使用「完整」路徑。

因爲當你綁定一些ItemControl並嘗試風格它的項目請記住,每個項目已經是你作爲ItemsSource

EDIT1收集的例子:
Window.xaml.cs文件:

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; 

這裏我沒有使用虛擬機,如果你想使用虛擬機只是將它添加到你的窗口的數據上下文並綁定列表。 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> 

只是風格,測試它。如果您將使用VM與Timeline屬性更改綁定到'timelinePropertyName'.groups

並閱讀有關綁定的更多信息。

+0

它不適用於「綁定timeline.groups」。我在主類中使用「datacontext = this」,是不是? –

+0

已更新的答案。 – Shakra

0

嘗試大寫相應的成員。 WPF區分大小寫。