将 ListView 字段绑定到嵌套列表 WPF

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的值,另一列应具有与该序列关联的事件列表。例如:在此处输入图片说明
其中第一行与第一个序列相关。矩形的颜色代表事件的类型。在第一个序列中有以下事件:

  • 类型为“红色”的 esrc 1
  • “红色”类型的 esrc 2
  • “绿色”类型的 esrc 3
  • “红色”类型的 esrc 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>
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*Dev 3

为了实现这一点,您需要在第一个列表中定义另一个列表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)

输出:

射击

在一边:

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