嗨大家好:我正在尝试设置datagrid行的样式。流程是基于网格中的字段(MsgType),我需要为行着色。用户可以在首选项屏幕中配置颜色(背面和前面),并将此配置保存在每个MsgType的可观察集合中。用户可以通过首选项屏幕更改此配置。我需要将颜色(可以更改)绑定到该MsgType的行。我尝试了以下方法,绑定仅在第一次工作....因为MsgType没有改变。转换器根据msgtype获取颜色。
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="{Binding MsgType, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource MessageTypeToBackConverter}}"/>
<Setter Property="Foreground" Value="{Binding MsgType, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource MessageTypeToForeConverter}}"/>
</Style>
</DataGrid.RowStyle>
任何帮助将不胜感激。我觉得我可能采取了错误的做法。
谢谢,
答案 0 :(得分:4)
根据您的招标行为,行为完全正常......
你有两个选择......
保持代码不变,无论何时更改首选项,请致电DataGrid.Items.Refresh()
或重新绑定DataGrid.ItemsSource
属性以重新生成DataGridRows
。通过这种方式,它们将获得更改的首选项的效果(即bg和fg颜色将刷新)。
更好的方法是修改逻辑,使用基于DynamicResources
Brushes
的{{1}}来DataGridRows
通过Triggers
为MsgType
假设MsgType
值是有限的&amp; {在编译时众所周知......
E.g。
假设您的public enum MsgType
{
None = 0,
Read = 1,
Edit = 2,
Delete = 3
}
是一些枚举,因此它在代表的值数量方面有明确的定义....
<DataGrid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyDefaultPreferences.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</DataGrid.Resources>
...
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter property="BackgroundColor" Value="{DynamicResource NoneMsgTypeBrush}" />
<Style.Triggers>
<DataTrigger Binding="{Binding MsgType}" Value="1">
<Setter Property="BackgroundColor" Value="{DynamicResource ReadMsgTypeBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding MsgType}" Value="2">
<Setter Property="BackgroundColor" Value="{DynamicResource EditMsgTypeBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding MsgType}" Value="3">
<Setter Property="BackgroundColor" Value="{DynamicResource DeleteMsgTypeBrush}" />
</DataTrigger>
</Style.Triggers>
</Style>
<强> XAML 强>
MyDefaultPreferences.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<SolidColorBrush x:Key="NoneMsgTypeBrush" Color="White"/>
<SolidColorBrush x:Key="ReadMsgTypeBrush" Color="Gray"/>
<SolidColorBrush x:Key="EditMsgTypeBrush" Color="Green"/>
<SolidColorBrush x:Key="DeleteMsgTypeBrush" Color="Red"/> </ResourceDictionary>
如下所示......
Brushes
因此,您需要在运行时完成所有操作,当用户更改首选项时,只需在MyDefaultPreferences.xaml
({a Dictionary
)中删除并添加 Uri uri = new Uri("MyDefaultPreferences.xaml", UriKind.RelativeOrAbsolute);
var _myDefaultResourceDictionary = Application.LoadComponent(uri) as ResourceDictionary;
_myDefaultResourceDictionary.Remove("ReadMsgTypeBrush");
_myDefaultResourceDictionary.Add("ReadMsgTypeBrush", new SolidColorBrush(Colors.Yellow));
相同的键... < / p>
E.g。
如果用户将“读取消息类型”更改为“黄色”,则只需执行此操作...
DynamicResource
删除和添加Brush资源会改变通过SolidColorBrush
引用的颜色(即在相应的{{1}}中)。
这是在运行时更改WPF应用程序的外观\主题的一种非常常见的方法。