我已经在stackoverflow上看了很多答案,但没有一个回复似乎能够给我我需要的东西。 This问题似乎非常密切地描述了我的情况,但解决方案并不适用于我。
我在DataGrid中有一个复选框列,当用户单击该复选框时,由于数据绑定到BindableList,因此与其关联的值(IsOnList)会更新。可绑定列表的类型对象还存储一个bool,用于指示值是否已更改(已更改),当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>
我班的相关部分是:
public bool IsOnList
{
get { return isOnList; }
set {
Changed = !changed;
isOnList = value;
}
}
public bool Changed
{
get { return changed; }
set { this.changed = value; }
}
我对C#和xaml很陌生,所以一直在努力尝试使这项工作。我错过了一些明显的东西吗?
答案 0 :(得分:2)
如果没有看到类的整个代码,您可能需要在类中实现INotifyPropertyChanged
,以便WPF绑定知道属性何时发生变化。您没有触发任何PropertyChanged
个事件,因此背景样式永远不会更新( Changed
中的DataGridRow
属性也不会更新。