C# DataContext属性上的WPF DataGrid DataTrigger绑定
DataContext属性的正确DataTrigger绑定是什么? 我有一个DataGrid,它是这样绑定的: XAML: 编辑: 参考ASh的解决方案,我对样式进行了编辑,并为“未更改”和“已修改”设置了触发器: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=
<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
pathDataRowState
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
pathDataRowState
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));
}
}