我有以下几个类:
class Event {
int eserc {get;set;}
int type {get;set;}
}
class Sequence {
List<Event> events;
int freq {get;set;}
}
如您所见,我在序列中有一个事件列表。我有一个序列列表。
我想用 GridView 显示带有序列列表的 ListView 。对于每个序列,我想要有2列,一列具有属性 freq 的值,另一列应该具有与该序列相关联的事件列表。例如:
第一行与第一个序列相关。矩形的颜色代表事件的类型。在第一个序列中有以下事件:
我知道我必须进行绑定才能显示值,但我不知道如何为序列执行此操作,因为我应该将列的值绑定到事件的值每个序列中的对象。
这是我为 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 这样的东西,但我对此并不确定,我也不太清楚它是如何工作的。我知道当源是一个对象时它可以工作,但在这种情况下,它是一个 List 的对象,我不知道如何获取信息。
答案 0 :(得分:1)
要实现这一点,您需要在第一个GridViewColumn
内定义另一个列表,列表应该是水平的(编辑ItemsPanelTemplate
)。您可以ListView
,ListBox
或ItemsControl
(看起来最合适)。
要根据Border
的类型绘制具有不同颜色的Event
,您应首先为DataTemplate
项定义自定义ItemsControl
,然后使用一个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
界面