gpt4 book ai didi

c# - 将 ListView 字段绑定(bind)到嵌套列表 WPF

转载 作者:行者123 更新时间:2023-11-30 12:20:52 25 4
gpt4 key购买 nike

我有以下类(class):

class Event {
int eserc {get;set;}
int type {get;set;}
}

class Sequence {
List<Event> events;
int freq {get;set;}
}

如您所见,我在序列中有一个事件列表。我有一个序列列表。
我想显示一个 ListView 和一个带有序列列表的 GridView。对于每个序列,我希望有 2 列,一列包含属性 freq 的值,另一列应该包含与该序列关联的事件列表。例如:enter image description here
其中第一行与第一个序列相关。矩形的颜色代表事件的类型。在第一个序列中有以下事件:

  • “红色”类型的 eserc 1
  • “红色”类型的 eserc 2
  • “绿色”类型的 eserc 3
  • “红色”类型的 eserc 4

我知道我必须进行绑定(bind)以显示值,但我不知道如何对序列进行绑定(bind),因为我应该将列的值绑定(bind)到 Event 每个单独的 Sequence 中的对象。
这是我为 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>

当然,绑定(bind)事件 是错误的,因为它只有在它是字符串时才有效,但这就是想法。
我在互联网上搜索过,我认为我应该使用类似DataTemplate 的东西,但我对此并不确定,而且我不太了解它是如何工作的。我知道当源是一个对象时它会起作用,但在这种情况下它是对象的列表,我不知道如何获取信息。

最佳答案

要实现这一点,您需要在第一个 GridViewColumn 中定义另一个列表,该列表应该是水平的(编辑 ItemsPanelTemplate)。您可以是 ListViewListBoxItemsControl(看起来最合适)。

要根据 Event 的类型绘制具有不同颜色的 Border,您应该首先为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>

序列集合:

    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; }
}

输出:

shot

侧面:

  1. 确保定义公共(public)属性以便能够正确绑定(bind)它们
  2. 使用命名约定
  3. 使用 ObservableCollection 而不是 List(它们实现了 ICollectionChanged,这对于更改通知很方便)
  4. 不要忘记实现 INotifyPropertyChanged 接口(interface)

关于c# - 将 ListView 字段绑定(bind)到嵌套列表 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49391159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com