我已经在 stackoverflow 上查看了许多答案,但似乎没有一个回复能够给我我需要的东西。 This问题似乎非常接近地描述了我的情况,但解决方案对我不起作用。
我在 DataGrid 中有一个复选框列,当用户单击该复选框时,由于数据绑定(bind)到 BindableList,因此与其关联的值 (IsOnList) 会更新。可绑定(bind)列表的类型对象还存储一个 bool 来指示值是否已更改(Changed),当 IsOnList 更改时该值会翻转。
如果该值已更改,我想通过将背景设置为红色来向用户表明这一点。 xaml 的相关部分如下。我已经在数据网格行上尝试了 setter 和触发器样式,但运气不佳(为了测试,我还将鼠标悬停在上面以确保它们被拾取,并且它工作正常,以及尝试像 TwoWay 这样的东西)。加载网格时将调用 DataTriggers,因此,由于加载网格时更改始终为 false,因此背景将为蓝色。当我单击复选框时,更新更改为 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>
我的类(class)的相关部分是:
public bool IsOnList
{
get { return isOnList; }
set {
Changed = !changed;
isOnList = value;
}
}
public bool Changed
{
get { return changed; }
set { this.changed = value; }
}
我对 C# 和 xaml 还很陌生,所以一直在努力让这项工作正常进行。我是否遗漏了一些明显的东西?
最佳答案
如果没有看到类的完整代码,您可能需要实现 INotifyPropertyChanged
在您的类中,以便 WPF 绑定(bind)知道属性何时发生更改。你没有解雇任何PropertyChanged
事件,因此背景样式永远不会更新(Changed
中的 DataGridRow
属性也不会更新)。
关于c# - 当 WPF/xaml 中的值更改时更新行颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826461/