【问题标题】:Binding background value in wpf datagrid cell在 wpf datagrid 单元格中绑定背景值
【发布时间】:2017-10-04 03:27:26
【问题描述】:

我在 VS2015 中有一个 WPF 应用程序。它是作为 MVVM 开发的,在代码隐藏类中没有任何内容。

它有一个包含数据网格的用户控件。我希望将任何已编辑单元格的背景颜色从白色更改为红色。我有一个按钮绑定到视图模型中的一个方法,该方法将更改的数据应用到数据库。

我的问题是数据网格列的 Background 属性的绑定。

我的 ViewModel 包含:

private ObservableCollection<ComparisonRec> _piToAccessFilteredRecs;

ComparisonRec 实现 ClientEntityBase

public class ComparisonRec : ClientEntityBase

这有一个 IsDirty 属性

我有以下 ValueConverter 类:

public class DirtyToBrushConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Brush ret;

            if ((bool)value == true)
            {
                ret = Brushes.Red;
            }
            else
            {
                ret = Brushes.White;
            } 

            return ret;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

我的用户控件的数据上下文设置如下:

    <UserControl.DataContext>
        <local:CompareUCViewModel />
    </UserControl.DataContext>

在 DataGrid 中我有绑定:

ItemsSource="{Binding PiToAccessFilteredRecs}"

对于我需要突出显示更改的 DataGridTextColumn,我有以下绑定:

Binding="{Binding Path=Access_Notes, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">

这可以很好地显示数据。为了尝试突出显示,我添加了以下内容:

<DataGridTextColumn.ElementStyle>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="Background" Value="{Binding Access_Notes.IsDirty, Converter={StaticResource DirtyToBrushConverter}}" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>

它不起作用:(我在输出窗口中看到显示的每一行的以下内容:

System.Windows.Data Error: 40 : BindingExpression path error: 'IsDirty' property not found on 'object' ''String' (HashCode=577941586)'. BindingExpression:Path=Access_Notes.IsDirty; DataItem='ComparisonRec' (HashCode=27207830); target element is 'TextBlock' (Name=''); target property is 'Background' (type 'Brush')

谁能看看我哪里出错了?

编辑 根据@XAMIMAX 的建议,如果我将绑定更改为:

<Setter Property="Background" Value="{Binding Access_Notes

Access_Notes 的字符串值(将在网格单元格中显示的内容)传递给值转换器并抛出异常,因为这不能转换为 (bool)

【问题讨论】:

  • 你能绑定整个Access_Notes 并在你的转换器中分析它,看看你得到了什么?
  • 什么是 Access_Notes?
  • 抱歉,Acess_Notes 是 ComparisonRec 的公共属性

标签: wpf xaml mvvm data-binding


【解决方案1】:

我在这里找到了答案:binding to a property of an object

因为 DataGridTextColumn 已经绑定到 Access_Notes 这意味着我的 setter 只需要绑定到 IsDirty 属性,如下所示:

Value="{Binding IsDirty

为了完整起见,我的工作 xaml 如下:

<DataGridTextColumn x:Name="access_NotesColumn" Width="SizeToHeader" Header="Access Notes" Binding="{Binding Path=Access_Notes, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
                                <DataGridTextColumn.ElementStyle>
                                    <Style TargetType="{x:Type TextBlock}">
                                        <Setter Property="Background" Value="{Binding IsDirty, Converter={StaticResource DirtyToBrushConverter}}" />
                                    </Style>
                                </DataGridTextColumn.ElementStyle>
                            </DataGridTextColumn>

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多