A. *_*olf 5 c# data-binding wpf listview
我有以下课程:
class Event {
int eserc {get;set;}
int type {get;set;}
}
class Sequence {
List<Event> events;
int freq {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在 Sequence 中有一个事件列表。我有一个序列列表。
我想用带有序列列表的GridView显示ListView。对于每个序列,我希望有 2 列,一列具有属性freq的值,另一列应具有与该序列关联的事件列表。例如:
其中第一行与第一个序列相关。矩形的颜色代表事件的类型。在第一个序列中有以下事件:
我知道我必须绑定到显示值,但我不知道如何为序列绑定,因为我应该将列的值绑定到每个单个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>
Run Code Online (Sandbox Code Playgroud)
当然,绑定事件是错误的,因为只有当它是一个字符串时才会起作用,但这就是想法。
我在互联网上搜索,我认为我应该使用类似DataTemplate 的东西,但我不确定这一点,我不太明白它是如何工作的。我知道当源是一个对象时它可以工作,但在这种情况下它是一个对象列表,我不知道如何获取信息。
为了实现这一点,您需要在第一个列表中定义另一个列表GridViewColumn,该列表应该是水平的(编辑ItemsPanelTemplate)。您可以选择 aListView或ListBoxan ItemsControl(看起来最合适)。
Border要根据 的类型绘制不同颜色的 a Event,您应该首先DataTemplate为项目定义一个自定义ItemsControl,并使用 aDataTrigger来设置颜色,这里是完整的 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>
Run Code Online (Sandbox Code Playgroud)
序列集合:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是具有所需邻接的类:
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; }
}
Run Code Online (Sandbox Code Playgroud)
输出:
在一边:
ObservableCollection代替List(他们实现了ICollectionChanged这对于更改通知很方便)INotifyPropertyChanged接口| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |