在WPF / xaml中值更改时更新行颜色

时间:2012-03-22 16:25:32

标签: c# xaml

我已经在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很陌生,所以一直在努力尝试使这项工作。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

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