Xaml DXGrid更改网格行的颜色DevExpress WPF

Xaml DXGrid更改网格行的颜色DevExpress WPF,xaml,devexpress,dxgrid,Xaml,Devexpress,Dxgrid,我已删除属性为的实体。当它变为真时,网格行应为灰色 为此,我使用以下代码: <dxg:TableView.RowStyle> <Style TargetType="{x:Type dxg:GridRowContent}"> <Style.Triggers> <DataTrigger Binding="{Binding DataContext.IsRemoved, Mode=O

我已删除属性为
的实体。当它变为真时,网格行应为灰色

为此,我使用以下代码:

    <dxg:TableView.RowStyle>
        <Style TargetType="{x:Type dxg:GridRowContent}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataContext.IsRemoved, Mode=OneWay}" Value="True">
                    <Setter Property="Background" Value="Gray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </dxg:TableView.RowStyle>
</dxg:TableView>

但它只有在网格第一次显示时才会运行。我想在值更改时更改颜色。属性实现
INotifyPropertyChange
事件

注意:这个答案是遗留的(请参阅我的其他答案)

此答案适用于v14.1之前的DevExpress版本,或v14.1及之后的DevExpress版本
使用LightweightTemplates=“无”

您需要为要更改的属性设置初始设置器。这是由于WPF使用样式的顺序造成的

在样式标记后包括此行:

完整示例:

<dxg:TableView.RowStyle>
    <Style TargetType="{x:Type dxg:GridRowContent}">
        <Setter Property="Background" Value="Black" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding DataContext.IsRemoved, Mode=OneWay}" Value="True">
                <Setter Property="Background" Value="Gray" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</dxg:TableView.RowStyle>   

您应该只写“行”而不是“数据上下文”

从DevExpress的v14.1开始,他们介绍。这使一切变得更快,但需要更改样式和数据触发器的指定方式

轻量级模板由附加属性
UseLightweightTemplates=“Row”
控制,默认情况下该属性处于启用状态。它可以切换到
None
,以实现向后兼容性

下面是一个MVVM工作示例,说明了如果为任何网格行设置了
IsDirty
属性,如何为行着色

<dxg:GridControl x:Name="MyGridControl"
        ItemsSource ="{Binding MyViewModelList}" 
        SelectionMode="None"
        VerticalAlignment="Stretch">
    <dxg:GridControl.Resources>
        <SolidColorBrush x:Key="GridRowIsDirty" Color="#FF602D2D" />
    </dxg:GridControl.Resources>
    <dxg:GridControl.View>
        <dxg:TableView UseLightweightTemplates="Row" >
            <dxg:TableView.RowStyle>
                <Style TargetType="dxg:RowControl">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Row.IsDirty}" Value="True">
                            <Setter Property="Background" Value="{StaticResource GridRowIsDirty}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </dxg:TableView.RowStyle>
        </dxg:TableView>
    </dxg:GridControl.View>
    <dxg:GridControl.Columns>
        <dxg:GridColumn x:Name="Included" FieldName="Included"/>
        <dxg:GridColumn x:Name="ColumnB" Header="Column B" FieldName="ColumnB" ReadOnly="True"/>
        <dxg:GridColumn x:Name="ColumnC" Header="Column C" FieldName="ColumnC" ReadOnly="True"/>ReadOnly="True"/>
    </dxg:GridControl.Columns>
</dxg:GridControl>
附录A:附加链接
附录B:其他解决方案 这在大多数情况下也有效,但如果事件源通过上下文菜单,则不起作用,因此不建议:

 <DataTrigger Binding="{Binding DataContext.IsDirty}" Value="True">
    <Setter Property="Background" Value="{StaticResource GridRowIsDirty}" />
 </DataTrigger>
在我做出这一改变后,一切都开始起作用:

  • 单击复选框时,背景颜色会立即更改(如果我们添加触发器以更改背景颜色,如上所示)
  • 编辑DxGrid会即时更改ViewModel
  • 更改ViewModel会立即更新DxGrid
  • 如果上下文菜单更新了ViewModel,那么一切都正常工作

在我尝试此代码之前,我的数据触发器根本不工作。关键是在
.IsRemoved
前面加上
DataContext
,而不是
RowData.Row
。非常详细的答案,正是我想要的,因为我还有一个IsDirty属性!
public bool IsDirty
{
    get { return _isDirty; }
    set
    {
        _isDirty = value;
        OnPropertyChanged();
    }
}
 <DataTrigger Binding="{Binding DataContext.IsDirty}" Value="True">
    <Setter Property="Background" Value="{StaticResource GridRowIsDirty}" />
 </DataTrigger>
 <dxg:GridControl Grid.Row="3" x:Name="TrsGridControl"
        ItemsSource ="{Binding MyObservableCollection}"                             
        VerticalAlignment="Stretch"
        AllowLiveDataShaping ="True">
    <dxg:GridControl.Resources>
        <converter:TestConverter x:Key="TestConverter" />
        <ControlTemplate x:Key="DisplayedOnTicketTrs">
                <dxe:CheckEdit x:Name="DisplayedOnTicketCheckEdit" HorizontalAlignment="Center" IsChecked="{Binding RowData.Row.DisplayedOnTicket, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
         </ControlTemplate>
    </dxg:GridControl.Resources>
    <dxg:GridControl.View>
        <dxg:TableView UseLightweightTemplates="All"/>
    </dxg:GridControl.View>
    <dxg:GridControl.Columns>            
        <dxg:GridColumn x:Name="DisplayedOnTicketTrs" DisplayTemplate="{StaticResource DisplayedOnTicketTrs}" Header="Displayed On Ticket?" HeaderToolTip="Displayed On Ticket?" AllowEditing="False"/>
                        Header ="Displayed On Ticket?"/>
        <dxg:GridColumn x:Name="ColumnA" Header="ColumnA" FieldName="ColumnA" ReadOnly="True"/>
        <dxg:GridColumn x:Name="ColumnB" Header="ColumnB" FieldName="ColumnB" ReadOnly="True"/>            
    </dxg:GridControl.Columns>
 </dxg:GridControl>