来自 XAML 中不同属性的 WPF DataGrid 单元格样式

Mat*_*ith 2 c# wpf xaml

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

这是一个代码示例:

<DataGrid ItemsSource="MyCollection">
  <DataGridTextColumn Header="MyColumn" Binding={Binding ColumnText} />
  <DataGridTextColumn Header="MyColumn2" Binding={Binding ColumnText2} />
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

非常感谢!

Ale*_*hul 5

如果我理解正确,您正在尝试通过 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>
Run Code Online (Sandbox Code Playgroud)

而且,当然,您可以使用自己的属性和您感兴趣的值更改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>
Run Code Online (Sandbox Code Playgroud)

不过要注意一件重要的事情,

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