2012-11-20 61 views
0

我想更改DataGridCell的內容。我在datagridview的一列像這樣在datatrigger上更改datagridcell中的內容

<DataGridCheckBoxColumn CellStyle="ChangeContentOfCellSstyle"... 

然後,我有一個DataTrigger像這樣:

<Style TargetType="DataGridCell" x:Key="ChangeContentOfCellSstyle"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsWashed}" Value="True"> 
      <Setter Property="Content" Value="The new value for the cell."/> 
      <Setter Property="Background" Value="Red"/> //sets the background of the cell to red just to show the trigger is working 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

但單元格的內容沒有改變。即使當我嘗試與DataGridTextColumn相同,雖然單元格變爲紅色。

回答

1

我已經刪除了我以前的答案,因爲使用模板選擇器是一個更好的方法。

首先,我創建了一個DataTemplateSelector類,可以根據綁定在DataTemplates之間進行切換,請注意參考將應用的樣式的2個屬性,我可以在這裏使用find資源,但我認爲這是更清潔,不需要視圖設計師堅持使用硬編碼模板鍵。

public class IsWashedStyleSelector : DataTemplateSelector 
{ 

    public DataTemplate TrueStyle { get; set; } 
    public DataTemplate FalseStyle { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     TestClass targetItem = item as TestClass; 
     if (targetItem != null) 
     { 
      return targetItem.IsWashed ? TrueStyle : FalseStyle; 
     } 
     return base.SelectTemplate(item, container); 
    } 
} 

我們使用這個模板選擇我不得不定義2數據模板,也可以例如在XAML資源的選擇。

<DataTemplate x:Key="styleIsWashedTrue"> 
    <Button>It's true</Button> 
</DataTemplate> 
<DataTemplate x:Key="styleIsWashedFalse"> 
    <Label>is false</Label> 
</DataTemplate> 

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector" TrueStyle="{StaticResource styleIsWashedTrue}" FalseStyle="{StaticResource styleIsWashedFalse}"/> 

最後選擇器可以在像這樣一個DataGridTemplateColumn使用。

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Binding="{Binding IsWashed}"/> 
      <DataGridTextColumn Binding="{Binding Text}"/> 
      <DataGridTemplateColumn CellTemplateSelector="{StaticResource isWashedStyleSelector}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

謝謝安迪,這看起來不錯。我現在會研究它。 –

0

這個回答真的是@ Andy的回答。看來我無法在評論中格式化代碼。

請注意,您可以在您的XAML中嵌入DataTemplate定義,將所有內容放在一起。

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector"> 
    <local:IsWashedStyleSelector.TrueStyle> 
    <DataTemplate> 
     <Button>It's true</Button> 
    </DataTemplate> 
    </local:IsWashedStyleSelector.TrueStyle> 
    <local:IsWashedStyleSelector.FalseStyle> 
    <DataTemplate> 
     <Label>is false</Label> 
    </DataTemplate> 
    </local:IsWashedStyleSelector.FalseStyle> 
</local:IsWashedStyleSelector> 

當然,這是當你想只在一個地方使用這些DataTemplate定義。