c# - 当 WPF/xaml 中的值更改时更新行颜色

标签 c# xaml

我已经在 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/

相关文章:

c# - LINQ:在 1 个 IQueryable 中返回 2 个 SELECT 进行分页?与存储库模式保持一致并且不更改返回类型

c# - 如果 timeInterval 没有用户交互,如何恢复到页面

c# - "doc"是 SQL 2008、C# 或 Entity Framework 的保留关键字吗?

c# - 使内容对话框像 Groove 应用程序中的那样可移动

wpf - WPF MVVM 中 DataGrid DataTemplate 组合框中的 IsDropDownOpen

c# - XAML 属性元素

c# - 在 ParameterizedThreadStart 中捕获的变量

c# - 哪些自动代码生成工具可用于 CaSTLe ActiveRecord 类?

wpf - 文本框文本修剪

wpf - 为什么有些属性需要在样式中定义一个默认值,DataTrigger 才会生效?