C# DataContext属性上的WPF DataGrid DataTrigger绑定

C# DataContext属性上的WPF DataGrid DataTrigger绑定,c#,wpf,xaml,datagrid,datatrigger,C#,Wpf,Xaml,Datagrid,Datatrigger,DataContext属性的正确DataTrigger绑定是什么? 我有一个DataGrid,它是这样绑定的: XAML: 编辑: 参考ASh的解决方案,我对样式进行了编辑,并为“未更改”和“已修改”设置了触发器: <Style x:Key="RowStateStyle" TargetType="{x:Type DataGridCell}"> <Style.Triggers> <DataTrigger Binding=

DataContext属性的正确DataTrigger绑定是什么? 我有一个DataGrid,它是这样绑定的:

XAML:

编辑:

参考ASh的解决方案,我对样式进行了编辑,并为“未更改”和“已修改”设置了触发器:

    <Style x:Key="RowStateStyle" TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=DataContext.Row.RowState,
                RelativeSource={RelativeSource Self}}" Value="Unchanged">
                <Setter Property="Foreground" Value="Green" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=DataContext.Row.RowState,
                RelativeSource={RelativeSource Self}}" Value="Modified">
                <Setter Property="Foreground" Value="Yellow" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Content.Text,
                RelativeSource={RelativeSource Self}}" Value="test">
                <Setter Property="Foreground" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>


在内容上触发。文本可以很好地工作,不变的也可以。但是,当我修改一个单元格(因此DataRowState=Modified)时,什么也不会发生,颜色保持绿色。有什么解决方案吗?

如果我

  • 使用
    DataContext.Row.RowState
    path

  • 不要使用双向模式

  • 并在设置值时删除枚举名称
    DataRowState

  • 使用派生的dataRow类:

    public class DataRowExt: DataRow, INotifyPropertyChanged
    {
        protected internal DataRowExt(DataRowBuilder builder) : base(builder)
        {
        }
    
        internal void OnRowStateChanged()
        {
            OnPropertyChanged("RowState");
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    数据触发器对我有效,如果我

  • 使用
    DataContext.Row.RowState
    path

  • 不要使用双向模式

  • 并在设置值时删除枚举名称
    DataRowState

  • 使用派生的dataRow类:

    public class DataRowExt: DataRow, INotifyPropertyChanged
    {
        protected internal DataRowExt(DataRowBuilder builder) : base(builder)
        {
        }
    
        internal void OnRowStateChanged()
        {
            OnPropertyChanged("RowState");
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    不幸的是,我还没到那里。请参阅我编辑的帖子。@ray,我猜当
    RowState
    更改时,
    DataRow
    不会引发事件或通知。现在无法检查或建议任何修复当我“重新绘制”网格(例如重新排序)时,将可视化更改。所以,要么是一点小技巧:每当单元格发生变化时重新绘制行,要么就是解决方案。然而,这将是非常恼人的,而不是简单地触发一个事件,如DataGrid_CellEditEnding,只是在代码方面更改颜色(仅3行代码)。你说呢?@ray,看看我的编辑和一些想法。我一直忘了在xaml中使用枚举的一种很长但类型安全的方法(叹气).sry,以感谢我迟来的回复。我已经实现了这种方法——无论出于何种原因,只有在重新绘制网格(排序COL)时,更改才会可视化。我已调试,所有方法(OnRowStateChanged、OnPropertyChanged)都按预期调用。因此,我真的不明白为什么它仍然不起作用。另一个论坛建议完全撤销这种方法,创建类,而不是使用DataTable,这也是为了追求WPF的MVVM。你怎么想?不幸的是我还没到那里。请参阅我编辑的帖子。@ray,我猜当
    RowState
    更改时,
    DataRow
    不会引发事件或通知。现在无法检查或建议任何修复当我“重新绘制”网格(例如重新排序)时,将可视化更改。所以,要么是一点小技巧:每当单元格发生变化时重新绘制行,要么就是解决方案。然而,这将是非常恼人的,而不是简单地触发一个事件,如DataGrid_CellEditEnding,只是在代码方面更改颜色(仅3行代码)。你说呢?@ray,看看我的编辑和一些想法。我一直忘了在xaml中使用枚举的一种很长但类型安全的方法(叹气).sry,以感谢我迟来的回复。我已经实现了这种方法——无论出于何种原因,只有在重新绘制网格(排序COL)时,更改才会可视化。我已调试,所有方法(OnRowStateChanged、OnPropertyChanged)都按预期调用。因此,我真的不明白为什么它仍然不起作用。另一个论坛建议完全撤销这种方法,创建类,而不是使用DataTable,这也是为了追求WPF的MVVM。你怎么认为?
    <DataTrigger Binding="{Binding Path=DataContext.Row.RowState,
                 RelativeSource={RelativeSource Self}}" 
                 Value="Unchanged">
        <Setter Property="Foreground" Value="Red" />
    </DataTrigger>
    
    public class DataTableExt: DataTable
    {
        protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
        {
            return new DataRowExt(builder);
        }
    
        protected override void OnRowChanged(DataRowChangeEventArgs e)
        {
            base.OnRowChanged(e);
            // row has changed, notifying about changes
            var r = e.Row as DataRowExt;
            if (r!= null)
                r.OnRowStateChanged();
        }
    }
    
    public class DataRowExt: DataRow, INotifyPropertyChanged
    {
        protected internal DataRowExt(DataRowBuilder builder) : base(builder)
        {
        }
    
        internal void OnRowStateChanged()
        {
            OnPropertyChanged("RowState");
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }