我有以下课程:
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, Type = "red"},
new Event(){Eserc=3, Type = "green"},
new Event(){Eserc=4, Type = "red"},
},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接口