2016-12-07 80 views
1

我的項目中有一個DataGrid,其中有一些使用PropertyDataBinding的列。C#WPF Datagrid使用代碼背後的單元格着色

<DataGrid x:Name="dataOutOfDb" Grid.Row="1" MaxHeight="500" AutoGenerateColumns="False" ItemsSource="{Binding Source=ZeichnungCollection}" Margin="47,10,1299,0" SelectionChanged="dataOutOfDb_SelectionChanged" CanUserAddRows="False" Grid.ColumnSpan="2" MouseDoubleClick="dataOutOfDb_MouseDoubleClick" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Zeichnungsnummer" Binding="{Binding AddColumnZeichnungsnummer, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Index" Binding="{Binding AddColumnIndex, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="V-ID" Binding="{Binding AddColumnVolanteIndex, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Änderung Intern" Binding="{Binding AddColumnAenderungIntern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Änderung Extern" Binding="{Binding AddColumnAenderungExtern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Dateiendung" Binding="{Binding AddColumnExtension, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/> 
    </DataGrid.Columns> 
</DataGrid> 

現在我希望最後一列「狀態」有一個顏色取決於狀態本身。像這樣,只有行中的單元格是綠色或紅色。

類屬性的是ISerializable的和屬性都充滿這樣的:

public void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    this.GetObjectData(info, context); 
    info.AddValue("AddColumnZeichnungsnummer", Zeichnungsnummer, typeof(string)); 
    info.AddValue("AddColumnIndex", Index, typeof(string)); 
    info.AddValue("AddColumnVolanteIndex", Volante_Index, typeof(int)); 
    info.AddValue("AddColumnAenderungIntern", Aenderung_Int, typeof(string)); 
    info.AddValue("AddColumnAenderungExtern", Aenderung_Ext, typeof(string)); 
    info.AddValue("AddColumnExtension", Extension, typeof(string)); 
    info.AddValue("AddColumnStatus", Status, typeof(string)); 
} 

有別人的想法如何設置一個顏色狀態單元格?

回答

0

我試過了,用直接的Background-Binding輸出;它doesn't造成任何錯誤,但細胞doesn't改變顏色

定義一個背景二傳手一個CellStyle會改變細胞的背景:

<DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="Background" Value="Yellow" /> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

如果你想設置基於AddColumnStatus屬性值的單元格的Background屬性,需要爲該屬性可能具有的每個可能值指定一個DataTrigger。當AddColumnStatus財產申報表「YourStatusA」和紅色,當它返回「YourStatusB」下面的示例標記將設置背景屬性爲綠色:

<DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="Background" Value="Yellow" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding AddColumnStatus}" Value="YourStatusA"> 
        <Setter Property="Background" Value="Green" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding AddColumnStatus}" Value="YourStatusB"> 
        <Setter Property="Background" Value="Red" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

還要注意的是,如果你打算改變AddColumnStatus屬性的值動態地在運行時並希望單元格中的顏色被更新,類中定義的AddColumnStatus屬性應實現INotifyPropertyChanged接口並引發更改通知:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

謝謝你的回答,我不知道這是否是最好的方法,但它似乎是最簡單的方法。編輯狀態時,我只需要記下更正xaml代碼。 – Only3lue

+0

使用CellStyle無疑是改變DataGrid中單元格顏色的最佳方式和推薦方法。 – mm8

1

這個問題在wpf Datagrid世界很常見,我建議你參考這個主題Change DataGrid cell colour based on values,其中@ H.B。給出瞭如何以正確的方式做出相關的答案。

+0

感謝您提供非常好的鏈接。我試圖用直接的背景綁定(Binding Out)它不會導致任何錯誤,但單元格不會改變顏色。 – Only3lue

+0

「您必須在顏色依賴的屬性的設置者中觸發屬性更改通知。」你有沒有注意到這部分?你必須添加OnPropertyChanged(「NameBrush」);在你的設置狀態 – NTinkicht

+0

是的,我讀過,我試圖添加OnPropertyChanged(...),但我不能在我的Setter中調用此方法。你知道我做錯了什麼嗎? – Only3lue