C# 数据绑定嵌套 ItemsControl wpf
C# data binding nested 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; }
}
在 Main 中我有这个:
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>
如何绑定每个项目源?因为timeline、group、track都是列表,所以需要在ItemsControl中展示。我很困惑
尝试将适当的成员大写。 WPF 区分大小写。
您不需要为内部列表中的绑定使用 'full' 路径。
因为当您绑定一些 ItemControl
并尝试为其项目设置样式时,请记住每个项目都已经是您用作 ItemsSource
的集合示例
编辑1:
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;
这里我没有使用 VM,如果你想使用 VM,只需将它添加到你的 window 的数据上下文并绑定列表到它。
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>
只是样式,测试了一下。如果您将使用带有 Timeline
属性 的 VM,请将绑定更改为 'timelinePropertyName'.groups
并阅读有关绑定的更多信息。
我想构建一个这样的用户界面(视频编辑器的时间轴)
我都有 类:
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; }
}
在 Main 中我有这个:
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>
如何绑定每个项目源?因为timeline、group、track都是列表,所以需要在ItemsControl中展示。我很困惑
尝试将适当的成员大写。 WPF 区分大小写。
您不需要为内部列表中的绑定使用 'full' 路径。
因为当您绑定一些 ItemControl
并尝试为其项目设置样式时,请记住每个项目都已经是您用作 ItemsSource
编辑1:
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;
这里我没有使用 VM,如果你想使用 VM,只需将它添加到你的 window 的数据上下文并绑定列表到它。 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>
只是样式,测试了一下。如果您将使用带有 Timeline
属性 的 VM,请将绑定更改为 'timelinePropertyName'.groups
并阅读有关绑定的更多信息。