XAML:
code>< DataGrid x:Name =dataGridGrid.Row =4Grid.ColumnSpan =2 ItemsSource ={Binding} CellStyle ={StaticResource RowStateStyle }> < / DataGrid> code在.cs中,网格绑定到一个DataTable,因此单元格的DataContext是DataRowView,其中包含作为属性行:
//包含大量行/列的DataTable dataGrid.DataContext = dataTable;编辑:
参考ASh的解决方案,我编辑了风格,并将其置于不变和修改的触发器中:
< Style x:Key =RowStateStyleTargetType ={x:Type DataGridCell}> < Style.Triggers> < DataTrigger Binding ={Binding Path = DataContext.Row.RowState, RelativeSource = {RelativeSource Self}}Value =Unchanged> < Setter Property =ForegroundValue =Green/> < / DataTrigger> < DataTrigger Binding ={Binding Path = DataContext.Row.RowState, RelativeSource = {RelativeSource Self}}Value =Modified> < Setter Property =ForegroundValue =Yellow/> < / DataTrigger> < DataTrigger Binding ={Binding Path = Content.Text, RelativeSource = {RelativeSource Self}}Value =test> < Setter Property =ForegroundValue =Red/> < / DataTrigger> < /Style.Triggers> < / Style>对Content.Text的触发效果非常好,不变也是如此。但是当我修改单元格(因此DataRowState = Modified)时,没有任何反应,颜色保持绿色。任何解决方案?
解决方案DataTrigger适用于我,如果我
使用 DataContext.Row.RowState 路径
使用 Mode = TwoWay
并删除枚举名称 DataRowState 当设置值
< DataTrigger Binding ={Binding Path = DataContext.Row.RowState, RelativeSource = {RelativeSource Self}} Value =Unchanged> < Setter Property =ForegroundValue =Red/> < / DataTrigger>
我发现另一篇与此问题相关的帖子
WpfToolkit DataGrid:突出显示已修改行
没有通知关于 RowState 更改的默认机制。但是可以在派生的dataTable类中创建一个:
public class DataTableExt:DataTable { protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {返回新的DataRowExt(builder); } protected override void OnRowChanged(DataRowChangeEventArgs e) { base.OnRowChanged(e); //行已更改,通知有关更改 var r = e.Row as DataRowExt; if(r!= null) r.OnRowStateChanged(); } }与派生的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)); } }
What's the correct DataTrigger binding for DataContext properties? I have a DataGrid which is bound like this:
XAML:
<DataGrid x:Name="dataGrid" Grid.Row="4" Grid.ColumnSpan="2" ItemsSource="{Binding}" CellStyle="{StaticResource RowStateStyle}" > </DataGrid>In .cs the grid is bound to a DataTable, hence the DataContext for a cell is DataRowView, containing Row as a property:
// DataTable containing lots of rows/columns dataGrid.DataContext = dataTable;Edit:
Refering to ASh's solution I edited the style and put in Triggers for Unchanged and Modified:
<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>Triggering on Content.Text works perfectly fine, so does Unchanged. However when I modify a cell (thus DataRowState = Modified), nothing happens and the color stays green. Any solution?
解决方案DataTrigger works for me, if I
use DataContext.Row.RowState path
don't use Mode=TwoWay
and remove enum name DataRowState when set Value
<DataTrigger Binding="{Binding Path=DataContext.Row.RowState, RelativeSource={RelativeSource Self}}" Value="Unchanged"> <Setter Property="Foreground" Value="Red" /> </DataTrigger>
I have found another post related to this issue
WpfToolkit DataGrid: Highlight modified rows
There is no default mechanism which notifies about RowState changes. But it is possible to create one in a derived dataTable class:
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(); } }with a derived dataRow class:
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)); } }
更多推荐
WPF DataGrid DataTrigger绑定DataContext属性
发布评论