2014-01-28 40 views
2

嗨,夥計們:我想樣式datagrid行。該流程基於網格中的字段(MsgType),我需要爲行着色。用戶可以在首選項屏幕中配置顏色(背面和背面),並將此配置保存在每個MsgType的可觀察集合中。用戶可以通過首選項屏幕更改此配置。我需要將顏色(可以更改)綁定到該MsgType的行。我已經嘗試了以下方法,並且綁定只能第一次工作......因爲MsgType不會更改。顏色由轉換器根據msgtype獲取。Datagrid行樣式綁定動態更改屬性

<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> 

任何幫助,將不勝感激。我覺得我可能會採取錯誤的做法。

感謝,

回答

3

好行爲是基於你的招投標工作的精細完美...

你有兩個選擇......

保持你的代碼,因爲它是,每當喜好變化請致電DataGrid.Items.Refresh()或重新綁定DataGrid.ItemsSource屬性以重新生成DataGridRows。這樣,他們將採取改變偏好的效果(即bg和fg顏色會刷新)。

更好的方法是通過Triggers修補你的邏輯使用基於DynamicResourcesBrushes轉色DataGridRows假設MsgType的值是有限&在編譯時衆所周知的......

例如

假設你MsgType是因此被它代表值的數量方面也定義了一些枚舉....

public enum MsgType 
{ 
    None = 0, 
    Read = 1, 
    Edit = 2, 
    Delete = 3 
} 

XAML

<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> 

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> 

所以你必須在運行時做的,當用戶改變偏好設置,只需取出後用相同的密鑰在MyDefaultPreferences.xaml添加Brushes(它的一個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)); 

這種刪除和添加一個刷機資源,改變無論它是通過DynamicResource稱爲顏色(即在相應的SolidColorBrush中)。

這是改變皮膚\在運行時的WPF應用主題的一個非常普遍的方式。

+1

謝謝WPF的話,作爲一個快速的解決方案,我已經使用Items.Refresh()解決方案,並能正常工作。我會稍微更改代碼以使用DynamicResources,以便正確完成。非常感謝您的快速回復。 –