我已經查看了一些已經在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,所以一直在努力試圖使這項工作。我錯過了明顯的東西嗎?
謝謝,會給你一個去,讓你知道它是如何去。 – Sokratees9 2012-03-22 16:46:07
工作,謝謝。 – Sokratees9 2012-03-22 16:56:21