【问题标题】:Styling DataGrid cell in code, based on class property基于类属性在代码中设置 DataGrid 单元格样式
【发布时间】:2015-01-15 22:35:27
【问题描述】:

我有一个绑定到数组的 DataGrid,并在运行时根据数组的大小生成列:

ObservableCollection<DisplayByte[]> items = new ObservableCollection<DisplayByte[]>();

// List is populated
... 
...

Style style = new Style(typeof(TextBlock));

Setter setter = new Setter(TextBlock.ForegroundProperty, Brushes.LightGreen);

DataTrigger trigger = new DataTrigger() { Binding = new Binding("IsEqual"), Value = true };

trigger.Setters.Add(setter);
style.Triggers.Add(trigger);

dgBlobViewer.Columns.Add( new DataGridTextColumn
                          { 
                              Header = "",
                              Binding = new Binding(string.Format("[{0}].Value", columnIndex++)),
                              ElementStyle = style
                          });

DisplayByte 类是这样的:

public class DisplayByte : INotifyPropertyChanged 
{
    private bool m_isequal;
    public DisplayByte(string value)
    {
        Value = value;
        IsEqual = false;
    }

    public String Value
    {
        get;
        set;
    }

    public Boolean IsEqual
    {
        get
        {
            return m_isequal;
        }
        set
        {
            m_isequal = value;
            OnPropertyChanged(new PropertyChangedEventArgs("IsEqual"));
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }
}

绑定工作正常,所以我在数据网格单元格上显示了 Value 属性的值。我想设置单元格的样式,因此如果 IsEqual 属性为真,它们的背景会发生变化,但它不起作用。所有的细胞都是白色的。

Datagrid 的 XAML 是这样的:

<DataGrid x:Name="dgBlobViewer" 
          Grid.Row="0" 
          Grid.RowSpan="1" 
          Margin="10,10,10,0" 
          ItemsSource="{Binding}"
          AutoGenerateColumns="False"
          FontFamily="Consolas" >

装订或样式有什么问题吗?

【问题讨论】:

    标签: wpf datagrid .net-4.5


    【解决方案1】:

    IsEqual 属性属于您的数据项,因此在这种情况下您必须使用DataTrigger

    var trigger = new DataTrigger();
    trigger.Binding = new Binding("[index].IsEqual");//index is placeholder.
    trigger.Value = true;
    trigger.Setters.Add(setter);
    style.Triggers.Add(trigger);
    

    【讨论】:

    • 谢谢,我更改了代码,但它不起作用。我更新了问题以发布编辑后的代码。
    • @RBasniak 你是否为DisplayByte 类实现了INotifyPropertyChanged?你也应该使用ObservableCollection&lt;T&gt; 而不是List&lt;T&gt;
    • 已更改为 ObservableCollection 并实现了 INotifyPropertyChanged(但不确定它是否真的正确),但尚未更新数据网格。应该有一种方法来调试绑定和样式。以这种方式尝试在黑暗中学习真的很难:(
    • 让它工作,只需要更改绑定,这必须在元素数组中完成,就像我在另一个绑定中所做的那样:“[{0}].IsEqual”。现在它正在工作。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2023-01-13
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多