WPF动态设置单元格样式

时间:2010-07-11 14:07:39

标签: c# wpf binding dynamic

我需要在WPF中生成一个“报告”,它只是一个网格。

但是,此网格的列和样式规则(例如,“如果值低于零,则为红色”)在编译时是未知的。

有数百个这样的问题,我必须阅读超过一半的问题,但我找不到这个要求的解决方案,这在WinForms中是微不足道的。

我已经设法通过设置ListView的ItemContainerStyle来设置整行的样式,但我无法让它专注于单个单元格。

因此我现在尝试使用CellTemplate方法,但这会引发错误({"Child with Name '{x:Type ListViewItem}' not found in VisualTree."}),当然,当我使用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;

我在我的搜索中遇到过DataTemplateSelectors,所以如果在没有任何已知XAML的情况下使用这些有用的参考,那么我也会很感激。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

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

哦,你也试图将Background属性设置为ListViewItem类型,这没什么意义..让我重新阅读并更新这个答案..

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

希望有所帮助!

答案 1 :(得分:0)

使用WPF Toolkit的DataGrid就是一个解决方案。 (评论是否需要更多细节)。