C# 动态设置单元格样式的WPF

C# 动态设置单元格样式的WPF,c#,wpf,binding,dynamic,C#,Wpf,Binding,Dynamic,我需要在WPF中生成一个简单的网格报告 但是,此网格的列和样式规则(如Red if值低于零)在编译时是未知的 像这样的问题有数百个,我一定读过一半以上,但我找不到解决这个问题的方法,这在WinForms中是微不足道的 通过设置ListView的ItemContainerStyle,我成功地设置了整行的样式,但我无法将其集中在单个单元格上 因此,我现在正在尝试CellTemplate方法,但这会引发一个错误{VisualTree中找不到名为“{x:Type ListViewItem}”的子项。}当

我需要在WPF中生成一个简单的网格报告

但是,此网格的列和样式规则(如Red if值低于零)在编译时是未知的

像这样的问题有数百个,我一定读过一半以上,但我找不到解决这个问题的方法,这在WinForms中是微不足道的

通过设置ListView的ItemContainerStyle,我成功地设置了整行的样式,但我无法将其集中在单个单元格上

因此,我现在正在尝试CellTemplate方法,但这会引发一个错误{VisualTree中找不到名为“{x:Type ListViewItem}”的子项。}当然,当我使用DisplayMemberBinding时,CellTemplate甚至根本不会被调用

我的转换器在传递值时会获取整行,而不仅仅是单元格的值,因此这可能是有用的信息

 GridView viewLayout = new GridView();
 for (int i=0; i<columns.Length; i++)
 {
    ColumnDisplaySettings col = columns[i];
    var g = new GridViewColumn() 
    { 
        Width = col.Width, 
        //DisplayMemberBinding = "[" + i + "]" /* Have to omit this for CellTemplate */
    };

    if (i == 0)
    {
       g.CellTemplate = new DataTemplate();
       var t = new DataTrigger();
       t.Binding = new Binding("[0]");
       t.Value = "0";
       var b = new Binding() { Converter = new MyBkColorConverter() };
       t.Setters.Add(new Setter(Control.BackgroundProperty, b,
          "{x:Type ListViewItem}")); /* Error here */
       g.CellTemplate.Triggers.Add(t);
    }

     viewLayout.Columns.Add(g);
 }
 lv.View = viewLayout;
我在搜索中遇到过DataTemplateSelector,因此如果在没有任何已知XAML的情况下使用这些工具时有有用的参考,我也会非常感激


感谢您提供的帮助。

发生此错误是因为{x:Type ListViewItem}是一个字符串。{x:..}表示法是XAML标记扩展,但您没有使用XAML。要在代码中引用列表ListViewItem,请使用typeofListViewItem

另外,您正在尝试将Background属性设置为类型ListViewItem,这没有什么意义。。让我重新阅读并更新这个答案

更新:Setter构造函数不需要第三个参数


希望有帮助

使用WPF工具包的DataGrid是一种解决方案。如果需要更多详细信息,请进行注释。

TargetType在本例中采用字符串,而不是类型。此外,您正在尝试将Background属性设置为我在此处看到的类型:第三个参数是targetName,而不是TargetType。样式具有目标类型,setter正在查找“setter用于的子节点的名称”。将在10秒钟内更新答案。嗨,Kieren,如果我不使用第三个参数,将不会设置任何内容。但是,如果我在ListView的ItemContainerStyle中使用完全相同的触发器,那么它会设置好。MyBkConverter只返回一个红色笔刷。