Datagrid Row样式绑定到动态更改的属性

时间:2014-01-28 03:34:35

标签: c# wpf datagrid

嗨大家好:我正在尝试设置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>

任何帮助将不胜感激。我觉得我可能采取了错误的做法。

谢谢,

1 个答案:

答案 0 :(得分:4)

根据您的招标行为,行为完全正常......

你有两个选择......

保持代码不变,无论何时更改首选项,请致电DataGrid.Items.Refresh()或重新绑定DataGrid.ItemsSource属性以重新生成DataGridRows。通过这种方式,它们将获得更改的首选项的效果(即bg和fg颜色将刷新)。

更好的方法是修改逻辑,使用基于DynamicResources Brushes的{​​{1}}来DataGridRows通过TriggersMsgType假设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应用程序的外观\主题的一种非常常见的方法。