gpt4 book ai didi

c# - 以编程方式更改 ListView 行的背景颜色(wpf)

转载 作者:太空狗 更新时间:2023-10-29 17:36:08 24 4
gpt4 key购买 nike

我有一个通过传递对象列表来填充 ListView 的类。该类使用反射来查看每个对象的属性以生成 ListView。如何更改 ListView 中一行的背景颜色。

page完全符合我的要求。唯一的问题是我的 ListView 绑定(bind)到对象列表。换句话说,ListView 的每个项目都是一个绑定(bind)的对象,而不是 ListViewItem。我假设这就是我无法将 ListView 中的某些项目转换为 ListViewItem 的原因。例如,当我这样做时:

ListViewItem someItem = (ListViewItem)listView1.Items[0];

我得到一个 InvalidcastException,因为如果我在哪里物理地将对象添加到 ListView,例如:

listview.items.add(someObject) 那么这将起作用,但是因为我将列表绑定(bind)到 ListView 那一行不起作用。我认为这就是我无法转换的原因。我之所以要转换它是因为 ListViewItem 有一个 Background 属性。

编辑

我可以用我尝试过的前 12 个对象做到这一点:

for (int i = 0; i < listView1.Items.Count; i++)
{
var lvitem = listView1.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem;
lvitem.Foreground = Brushes.Green;
}

我得到这个错误:

first try

我也试过这个:

foreach (Tiro t in listView1.Items)
{
var lvitem = listView1.ItemContainerGenerator.ContainerFromItem(t) as ListViewItem;
if (t.numero == 0 || t.numero == 37)
{
//lvitem.Background = Brushes.Green;
lvitem.Foreground = Brushes.Green;
}
else if (t.numero % 2 == 0)
{
//lvitem.Background = Brushes.Red;
lvitem.Foreground = Brushes.Red;
}
else
{
//lvitem.Background = Brushes.Gray;
lvitem.Foreground = Brushes.Black;
}

}

我得到了同样的错误:

enter image description here

我不明白为什么 lvitem 在第 12 次迭代后为空?

它仅适用于正在显示的项目....

最佳答案

您需要引入 ViewModel 而不是分解 WPF UI。例如我可以按如下方式创建一个

public class ItemVM : INotifyPropertyChanged // if you want runtime changes to be reflected in the UI
{
public string Text {... raise property change in setter }
public Color BackgroundColor {... ditto... }
}

接下来在您的 DataContext 中创建一个包含此类对象的列表作为属性,以便您的 ListView 可以绑定(bind)到它。

// e.g. MainWindow
public IEnumerable<ItemVM> Items { get; set; }

现在您需要做的就是将您的 ListView 绑定(bind)到这个集合并正确连接 UI 的 DataContext

       <ListView x:Name="MyListView" ItemsSource="{Binding Items}" HorizontalContentAlignment="Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}">
<TextBlock.Background>
<SolidColorBrush Color="{Binding BackgroundColor}"/>
</TextBlock.Background>
</TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Click="Button_Click" Content="Go PaleGreen"/>

现在更改背景颜色很容易。只需将相应的 ItemVM 对象的属性设置为您想要的 Color 即可。例如将所有项目设置为淡绿色

private void Button_Click(object sender, RoutedEventArgs e)
{
foreach (var item in Items)
item.BackgroundColor = Colors.PaleGreen;
}

关于c# - 以编程方式更改 ListView 行的背景颜色(wpf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6171502/

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