我有以下课程:
class Event { int eserc {get;set;} int type {get;set;} } class Sequence { List<Event> events; int freq {get;set;} }
如您所见,我在Sequence中有一个事件列表.我有一个Sequence列表.我想用一个带有序列列表的GridView显示一个ListView.对于每个序列,我想要有2列,一列具有属性freq的值,另一列应该具有与该序列相关联的事件列表.例如:
第一行与第一个序列相关.矩形的颜色代表事件的类型.在第一个序列中有以下事件:
> eserc 1类型“红色”
> eserc 2类型“红色”
> eserc 3类型“绿色”
> eserc 4类型“红色”
我知道我必须进行绑定才能显示值,但我不知道如何为序列执行此操作,因为我应该将列的值绑定到每个单个Sequence中的Event对象的值.这就是我为ListView编写的代码:
<ListView Name="resultsList" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="3"> <ListView.View> <GridView> <GridViewColumn Header="Sequence" Width="450" displayMemberBinding="{Binding events}"/> <GridViewColumn Header="Frequence" displayMemberBinding="{Binding freq}"/> </GridView> </ListView.View> </ListView>
当然,绑定事件是错误的,因为只有当它是一个字符串时才会起作用,但这就是想法.
我在互联网上搜索,我认为我应该使用类似DataTemplate的东西,但我不确定,我不明白它是如何工作的.我知道它在源是一个对象时有效,但在这种情况下它是一个对象列表,我不知道如何获取信息.
解决方法
要实现这一点,您需要在第一个GridViewColumn中定义另一个列表,列表应该是水平的(编辑ItemsPanelTemplate).您可以使用ListView,ListBox或ItemsControl(看起来最合适).
要根据事件的类型绘制具有不同颜色的边框,首先应为ItemsControl项定义自定义DataTemplate,并使用DataTrigger设置颜色,这里是完整的xaml:
<ListView Name="ResultsList" ItemsSource="{Binding SequenceCollection}"> <ListView.View> <GridView> <GridViewColumn Header="Sequence" Width="450" > <GridViewColumn.CellTemplate> <DataTemplate> <ItemsControl ItemsSource="{Binding Events}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"></StackPanel> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Border> <Border.Style> <Style targettype="Border"> <Style.Triggers> <DataTrigger Binding="{Binding Type}" Value="red"> <Setter Property="Background" Value="red"/> </DataTrigger> <DataTrigger Binding="{Binding Type}" Value="green"> <Setter Property="Background" Value="Green"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <TextBlock Text="{Binding Eserc,StringFormat='{}{0} '}"></TextBlock> </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Frequence" displayMemberBinding="{Binding Freq}"/> </GridView> </ListView.View> </ListView>
SequenceCollection:
private ObservableCollection<Sequence> _sequenceCollection =new ObservableCollection<Sequence>() { new Sequence(){Events = new ObservableCollection<Event>() { new Event(){Eserc=1,Type = "red"},new Event(){Eserc=2,new Event(){Eserc=3,Type = "green"},new Event(){Eserc=4,},Freq = 3} }; public ObservableCollection<Sequence> SequenceCollection { get { return _sequenceCollection; } set { if (Equals(value,_sequenceCollection)) return; _sequenceCollection = value; OnPropertyChanged(); } }
这里有你需要的邻接课程:
public class Event { public int Eserc { get; set; } public string Type { get; set; } } public class Sequence { public ObservableCollection<Event> Events { get; set; } public int Freq { get; set; } }
输出:
在一边:
>确保定义公共属性以便能够正确绑定它们>使用命名约定>使用ObservableCollection而不是List(它们实现ICollectionChanged,这对于更改通知很方便)>不要忘记实现INotifyPropertyChanged接口