【问题标题】:WPF DataGrid cell style from different property in XAML来自 XAML 中不同属性的 WPF DataGrid 单元格样式
【发布时间】:2016-04-07 19:21:31
【问题描述】:

是否可以将数据网格列值绑定到 ItemsSource 中指定的绑定类的一个属性,但引用该类中的不同属性来设置单元格的样式?

这是一个代码示例:

<DataGrid ItemsSource="MyCollection">
  <DataGridTextColumn Header="MyColumn" Binding={Binding ColumnText} />
  <DataGridTextColumn Header="MyColumn2" Binding={Binding ColumnText2} />
</DataGrid>

假设我在 MyCollection 中的对象中有另外两个属性(Enum 或 Brush),我想参考这些属性来设置各个单元格的背景颜色;这个可以吗?

编辑 - 我需要对多个列执行此操作,每个列查看不同的属性以确定它应该是什么颜色;我在上面的代码示例中添加了第二列。

我知道我可以根据 ColumnText 中的值设置样式,但这不是我需要做的。

我尝试设置样式数据触发器,但是当我尝试绑定时,我只能绑定到整体数据上下文中的某些内容,而不是绑定到正在填充当前行的对象中的另一个属性。

非常感谢!

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    如果我理解正确,您正在尝试通过 Row 模型中的属性设置单元格背景。

    您可以通过设置单元格样式来实现此目的,并将 DataTrigger 设置为该样式以绑定到您想要的属性。


    示例

    你想让每个单元格,将数字 3 涂成绿色:

    <DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="True">
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Number}" Value="3">
                        <Setter Property="Background">
                            <Setter.Value>
                                <SolidColorBrush Color="Green"/>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>
    

    当然,您可以将 Number 属性更改为您自己的属性以及您感兴趣的值。

    如果你想做一些更复杂的事情,比如值范围等,你应该使用传统的转换器方式。


    编辑

    如果要为每一列制作不同的单元格样式,则应显式设置列:

    <DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Number}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Number}" Value="3">
                                <Setter Property="Background">
                                    <Setter.Value>
                                        <SolidColorBrush Color="Green"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    有一点需要注意,

    您必须设置 AutoGenerateColumns="False" 否则列将生成两次。

    【讨论】:

    • 感谢您的回复!我意识到我的问题并不清楚,我需要在多个列中执行此操作,每个列都引用不同的属性来设置其颜色。
    • 我试过你的例子,在数据触发器中我不能绑定到行的属性,只能绑定到外部数据上下文对象的属性。
    • 我已将答案添加到明确的列
    • 感谢您的更新!不过,我遇到了和以前一样的问题。在 DataTrigger 中,我只能绑定到外部数据上下文(整个 XAML 中可用的视图模型)的属性,而不能绑定到行的另一个属性。
    • 我猜你的意思是自动完成不允许你。但别担心,我认为这是 Visual Studio 的错误或类似的东西。随意输入您的属性的名称,编译,然后让奇迹发生。 :)
    猜你喜欢
    • 2011-05-12
    • 2021-01-11
    • 2020-03-27
    • 1970-01-01
    • 2017-05-31
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多