2012-03-22 60 views
2

我已經查看了一些已經在stackoverflow上的答案,但沒有一個答案似乎能夠給我我需要的東西。問題似乎很密切地描述我的情況,但解決方案並不適合我。當WPF中的值發生更改時更新行顏色/xaml

我有一個DataGrid中的複選框列,並且當用戶單擊複選框時,由於數據綁定到BindableList,與它關聯的值(IsOnList)被更新。可綁定列表的類型對象還存儲一個布爾值來指示該值是否已更改(更改),當IsOnList更改時該值將被翻轉。

如果數值已更改,我想通過將背景設置爲紅色來向用戶指出此情況。下面是xaml的相關部分。我已經嘗試了數據網格行上的setter和觸發器樣式,但運氣不大(爲了測試,我也將鼠標放在了上面,以確保它們被拾取,並且它運行良好,並嘗試像TwoWay這樣的事情)。數據觸發器將在網格加載時調用,因此,當網格加載時,更改始終爲假,背景將爲藍色。當我單擊複選框時,該更新更改爲true,背景不會更改顏色。我甚至爲Changed屬性添加了一列,以查看該值是否更改,但不是。

<UserControl.Resources> 
    <vm:ProductListEditViewModel x:Key="ViewModel"/> 
    <vm:ChangedHighlightConverter x:Key="ChangedHighlightConverter"/> 
</UserControl.Resources> 

<tk:DataGrid ItemsSource="{Binding EditableLists}" x:Name="dataGrid" Grid.Row="1" 
       ... 
       SelectedItem="{Binding Path=SelectedAttribute, Mode=TwoWay}"> 

     <tk:DataGrid.RowStyle> 
      <Style TargetType="tk:DataGridRow"> 
       <Setter Property="Background" Value="{Binding Changed, Converter={StaticResource ChangedHighlightConverter}}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Changed, Mode=OneWay}" Value="True"> 
         <Setter Property="Background" Value="Red" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Changed, Mode=TwoWay}" Value="True"> 
         <Setter Property="Background" Value="Red" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Changed}" Value="False"> 
         <Setter Property="Background" Value="Blue" /> 
        </DataTrigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Foreground" Value="Red"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </tk:DataGrid.RowStyle> 

     <tk:DataGrid.Columns> 
      <tk:DataGridTextColumn Header="Group Name" Binding="{Binding GroupDescription}" Width="120" IsReadOnly="True"/> 
      <tk:DataGridTextColumn Header="List Name" Binding="{Binding ListDescription}" Width="120" IsReadOnly="True"/> 
      <tk:DataGridTextColumn Header="List ID" Binding="{Binding ListId}" Width="50" IsReadOnly="True"/> 
      <tk:DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" Width="50" IsReadOnly="True"/> 
      <tk:DataGridTextColumn Header="Comment" Binding="{Binding Description}" Width="120" IsReadOnly="True"/> 
      <tk:DataGridTextColumn Header="Changed" Binding="{Binding Changed, Mode=TwoWay}" Width="40" IsReadOnly="True"/> 
      <tk:DataGridTemplateColumn Header="On List" Width="50"> 
       <tk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox HorizontalAlignment="Center" IsChecked="{Binding Path=IsOnList, UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 
       </tk:DataGridTemplateColumn.CellTemplate> 
      </tk:DataGridTemplateColumn> 
     </tk:DataGrid.Columns> 

    </tk:DataGrid> 

我的類的相關部分:

public bool IsOnList 
    { 
     get { return isOnList; } 
     set { 
      Changed = !changed; 
      isOnList = value; 
     } 
    } 

public bool Changed 
{ 
     get { return changed; } 
     set { this.changed = value; } 
} 

我很新的C#和XAML,所以一直在努力試圖使這項工作。我錯過了明顯的東西嗎?

回答

2

沒有看到你的類的整個代碼,你可能需要在你的類中實現INotifyPropertyChanged,以便WPF綁定知道屬性何時發生變化。您沒有發射任何PropertyChanged事件,因此背景樣式不會更新(也不會Changed屬性DataGridRow)。

+0

謝謝,會給你一個去,讓你知道它是如何去。 – Sokratees9 2012-03-22 16:46:07

+0

工作,謝謝。 – Sokratees9 2012-03-22 16:56:21

相關問題