WPF - 在 DataGrid 中绑定 SolidColorBrush 不起作用

Posted

技术标签:

【中文标题】WPF - 在 DataGrid 中绑定 SolidColorBrush 不起作用【英文标题】:WPF - Binding SolidColorBrush inside DataGrid not working 【发布时间】:2015-06-16 03:37:30 【问题描述】:

您好,感谢您光临。

我需要在运行时将 SolidColorBrush 绑定到 DataGrid 单元格 - DataGrid 的 ViewModel 包含 SolidColorBrush 类型的属性,并且列本身由 DataGridTemplateColumn 填充:

<DataGridTemplateColumn Header="source column" Width="3.5*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Border Background="Binding Path=SourceColumnBackground">
                <Label x:Name="txbSourceName" Content="Binding Path=SourceColumnDescriptionString"></Label>
            </Border>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="Binding Path=DataContext.SourceColumns, RelativeSource=RelativeSource AncestorType=x:Type Window" 
                        DisplayMemberPath="ColumnDescription"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

(使用边框是一项测试,因为我在将背景绑定到 ComboBox (Windows 8.1) 时遇到了类似的问题)。

文本的绑定可以作为一种魅力,ComboBox 的 ItemsSource 的绑定也可以。唯一不起作用的是背景。​​

我在 DataGrid 之外(在周围的 Grid 中)使用边框和背景绑定测试了它,如本例所示(不同的属性,因为它没有绑定到 DataGrid 数据)并且效果很好。

简而言之我的问题: 如果在 DataGrid 内部,将 SolidColorBrush 绑定到 Border 不会产生明显的效果 - 如果在外部,相同的代码可以工作。有人可以帮忙吗?

提前感谢您的帮助!

(已编辑,因为代码块吃了一行)

【问题讨论】:

作为旁注,您通常不应该在 ViewModel 中处理诸如颜色之类的事情(如果它不是您模型的属性)。如果颜色只表示错误/正常等状态,最好通过属性(布尔值、枚举等)表达这一点,并将样式触发器应用于该属性。 你是对的。谢谢你的反馈。我之前尝试过这种方式,但由于它不起作用,我通过刷子尝试了它 - 效果不佳。但我应该尽快重写我的代码。 【参考方案1】:

使用与设置项目来源相同的方法设置绑定

Binding Path=DataContext.SourceColumnBackground, RelativeSource=RelativeSource AncestorType=x:Type Window

另外,请确保您绑定到 System.Windows.Media.Brush

【讨论】:

谢谢你的回答,但是我不想改变ComboBox的Background,我想改变Border的Background属性。 ComboBox 使用RelativeSource 属性,因为它的源只能找到一次。绑定属性的类型是 System.Windows.Media.SolidColorBrush(它在不同的上下文中工作,问题只发生在 DataGrid 内部)。 SourceColumnBackground 属性从何而来?它是数据上下文中的单个属性,还是包含在数据网格的项目源中的属性?如果它是数据上下文中的单个属性,您将需要使用相对源(我不是专家,但它与数据网格的可视/逻辑树有关,因为您已经绑定到数据网格项目源数据网格中包含的任何内容都将使用您的项目源绑定的任何内容作为其数据上下文) 该属性来自与标签的文本属性相同的枚举项,因此不需要RelativeSource(在我的理解中)。【参考方案2】:

感谢大家的帮助。 我发现了问题,而且是我自己。我想称呼自己的名字是为了明确地在这里使用它们。

如果你想做我所做的,你可以使用我的原始代码。它按预期工作。如果您想知道我解决了哪个问题 - 我创建了一个新的 ViewModel 属性以绑定到 DataGrid,但我忘记更改 ItemsSource 绑定。

Mea 过失,mea maxima 过失...

【讨论】:

以上是关于WPF - 在 DataGrid 中绑定 SolidColorBrush 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Wpf:如何从嵌套的 DataGrid 中绑定 SelectedItem

datagrid数据绑定的概念

在 MVVM 中的 Datagrid 中绑定 WPF 组合框不保存更改

wpf 4.0 datagrid模板列双向绑定问题

在XAML代码中绑定数据时,WPF DataGrid ItemsSource绑定不显示数据

wpf datagrid 怎么增加数据行