我有一个属性为IsRemoved的实体。当它变成真时,网格行应该是灰色的。
为此,我使用以下代码:
<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事件。
发布于 2012-10-04 09:57:03
注意:这个答案是遗留的(请参阅我的另一个答案)。
此答案适用于v14.1之前的DevExpress版本,或使用UseLightweightTemplates="None"的DevExpress版本v14.1及之后的版本。
您需要拥有要更改的属性的初始setter。这是由于WPF使用样式的顺序所致。
在你的style标签后面加上这一行:
<Setter Property="Background" Value="Black" />
完整示例:
<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> 发布于 2016-05-25 19:37:08
从DevExpress的14.1版开始,他们引入了Optimized Mode which uses Lightweight Templates。这使得一切都变得更快,但需要更改样式和DataTriggers的指定方式。
轻量级模板由attached属性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>在此网格后面的ViewModel中:
public ObservableCollection<MyViewModel> MyViewModelList { get; set; }网格中的每一行都指向一个MyViewModel类型的类,该类包含一个自定义的IsDirty标志,我们可以根据需要进行设置:
public bool IsDirty
{
get { return _isDirty; }
set
{
_isDirty = value;
OnPropertyChanged();
}
}附录A:附加链接
请参阅DevExpress: How to disable focused/selected row colors.
的
附录B:其他解决方案
这在大多数情况下也是有效的,但如果事件的来源是通过上下文菜单,则不会起作用,因此不建议这样做:
<DataTrigger Binding="{Binding DataContext.IsDirty}" Value="True">
<Setter Property="Background" Value="{StaticResource GridRowIsDirty}" />
</DataTrigger>附录C: AllowLiveDataShaping
如果触发器未触发,请尝试在<GridControl>中打开AllowLiveDataShaping="True"。但是,尽量避免这种情况,因为它(理论上)会影响大型复杂网格的速度(它对大多数合理大小的网格没有明显的影响)。
附录D:如果所有其他方法都失败了,请使用自定义ControlTemplate
随着"UseLightweightTemplates“的引入,DevExpress一直专注于速度。然而,用于速度的技术涉及到关闭可能会减慢速度的绑定。
这意味着如果我们更改了DxGrid单元格中的某些内容,则ViewModel中的值不会更改,直到用户切换到下一个单元格或行。这意味着ViewModel落后于网格中的实际内容。
要解决这个问题,我能找到的唯一解决方案是完全绕过DevExpress的模板,而使用我自己的模板。这意味着DxGrid别无选择,只能显示一个自定义模板,一旦用户编辑它,它就会立即更新ViewModel,这意味着行颜色会立即更改:
<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>在我做了这个更改之后,一切都开始正常工作:
当复选框被点击时,背景颜色会立即改变(如果我们添加了改变背景颜色的触发器,above).
发布于 2016-02-23 21:05:38
你应该只写"Row“而不是"DataContext”
https://stackoverflow.com/questions/11209514
复制相似问题