在列表视图中添加一个ListViewItem(不是我创建的类)
本文关键字:创建 ListViewItem 一个 添加 列表 视图 | 更新日期: 2023-09-27 18:04:25
到目前为止,我使用
将项目添加到listview中lstView.Items.Add(new MyData("Val", 1));
问题是我不能简单地用items[I]. background .
改变项目的样式(比如背景)。我尝试让MyData继承ListViewItem,但绑定不工作。
我的绑定:
<GridViewColumn Header="my var" DisplayMemberBinding="{Binding Path=Name}" />
当我将项目添加为我自己的类时,可以工作,但当我的类继承listviewitem时则不行。我还尝试添加一个listviewitem与我的类的DataContext没有运气。
有人知道如何解决这个问题吗?
WPF具有数据模板的概念,可以将可视化与底层数据分离。ListView(和其他ItemsControl一样)通过ItemTemplate
属性为它的项提供数据模板。你可以在ItemsControl的样式化和模板化中了解到。
给定这个简单的DataItem类
public class DataItem
{
public string ItemText { get; set; }
public Brush ItemBackground { get; set; }
}
一个非常简单的DataTemplate可以只包含一个Border和一个TextBlock控件:
<ListView Name="listView">
<ListView.ItemTemplate>
<DataTemplate>
<Border Background="{Binding ItemBackground}">
<TextBlock Margin="4" Text="{Binding ItemText}"/>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在具有GridView的ListView中,您将指定GridViewColumn的CellTemplate
而不是ItemTemplate
:
<ListView Name="listView">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border Background="{Binding ItemBackground}">
<TextBlock Margin="4" Text="{Binding ItemText}"/>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
现在你可以简单地添加数据项到ListView,像这样:
listView.Items.Add(new DataItem { ItemText = "Item 1", ItemBackground = Brushes.AliceBlue });
listView.Items.Add(new DataItem { ItemText = "Item 2", ItemBackground = Brushes.LemonChiffon });
listView.Items.Add(new DataItem { ItemText = "Item 3", ItemBackground = Brushes.LightCoral });
为了使UI对DataItem对象的更改作出反应,DataItem类必须实现INotifyPropertyChanged。
public class DataItem : INotifyPropertyChanged
{
...
}
为了更好地分离数据和UI,您不会直接将项目添加到ListView的Items
集合中,而是将ItemsSource
属性绑定到ObservableCollection<DataItem>
类型的属性:
<ListView ItemsSource="{Binding DataItems}">
...
</ListView>
您可以在数据绑定概述/绑定到集合中阅读更多关于此主题的内容。
你可以使用数据绑定,对于每个项目,关联一个属性,如BackColor项目,绑定项目(到ObservableCollection),如果你想改变颜色,简单调用item.BackColor=…这就行了!