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

时间:2018-03-20 17:56:24

标签: c# wpf listview data-binding

我有以下几个类:

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

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

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

  • eserc 1类型&#34;红色&#34;
  • eserc 2类型&#34;红色&#34;
  • eserc 3类型&#34;绿色&#34;
  • eserc 4类型&#34;红色&#34;

我知道我必须进行绑定才能显示值,但我不知道如何为序列执行此操作,因为我应该将列的值绑定到事件的值每个序列中的对象。
这是我为 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 的对象,我不知道如何获取信息。

1 个答案:

答案 0 :(得分:1)

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

要根据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; }
}

输出:

shot

侧面:

  1. 确保定义公共属性以便能够正确绑定它们
  2. 使用命名惯例
  3. 使用ObservableCollection代替List(他们实施ICollectionChanged,这对于更改通知非常方便)
  4. 不要忘记实施INotifyPropertyChanged界面