【问题标题】:Updating row colour when a value changes in WPF/xaml当 WPF/xaml 中的值更改时更新行颜色
【发布时间】:2012-03-22 16:25:31
【问题描述】:

我已经在 stackoverflow 上查看了许多答案,但似乎没有一个回复能够满足我的需求。 This question 似乎很贴切地描述了我的情况,但该解决方案对我不起作用。

我在 DataGrid 中有一个复选框列,当用户单击该复选框时,由于数据绑定到 BindableList,因此与其关联的值 (IsOnList) 会更新。可绑定列表的类型对象还存储了一个 bool 来指示值是否已更改(Changed),当 IsOnList 更改时会翻转。

如果值已更改,我想通过将背景设置为红色来向用户表明这一点。 xaml 的相关部分如下。我已经在数据网格行上尝试了 setter 和 trigger 样式,但运气不佳(为了测试,我还把鼠标放在上面以确保它们被拾起,它工作正常,以及尝试像 TwoWay 这样的东西)。加载网格时将调用 DataTriggers,因此,由于加载网格时 changed 始终为 false,因此背景将为蓝色。当我单击复选框时,将 Changed 更新为 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 还很陌生,所以一直在努力尝试使其工作。我错过了什么明显的东西吗?

【问题讨论】:

    标签: c# xaml


    【解决方案1】:

    在没有看到类的完整代码的情况下,您可能需要在类中实现INotifyPropertyChanged,以便 WPF 绑定知道属性何时发生变化。您不会触发任何PropertyChanged 事件,因此背景样式将永远不会更新(DataGridRow 中的Changed 属性也不会更新)。

    【讨论】:

    • 谢谢,会试一试,告诉你进展如何。
    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2011-05-14
    • 2018-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多