【问题标题】:Binding generic cell properties in DataGrid [duplicate]在 DataGrid 中绑定通用单元格属性
【发布时间】:2017-03-06 08:01:00
【问题描述】:

我正在尝试为 DataGrid 中具有特定值的每个单元格设置特定颜色。我在网上看到了很多,但我没有找到一个接近我的情况。 基本上我有这个DataGrid 结构:

<DataGrid ItemsSource="{Binding MatchService.Matches}" AutoGenerateColumns="False" 
                      CanUserAddRows="false" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="{DynamicResource championship}" Binding="{Binding Competition}"/>
        <DataGridTextColumn Header="1" Binding="{Binding HomeWin}"/>
        <DataGridTextColumn Header="X" Binding="{Binding Draw}"/>
    </DataGrid.Columns>

所以我需要使用纯 xaml 解决方案,特别是处理所有单元格值的通用样式。例如,如果HomeWin 单元格的值为&lt;50,则单元格背景将为red,如果单元格值为&gt;60,则背景将为绿色。

如何在没有编写转换器等的情况下为每个DataGridTextColumn 创建默认样式并绑定它?

谢谢。

【问题讨论】:

  • 您可以为DataGridTextColumn 定义默认样式,但如果您想要在触发器中进行属性值比较而不是“等于”,则必须编写一个转换器。并且不要编写 NumberToBrush 转换器。编写一个数字比较转换器并将画笔设置在使用该触发器的 DataTrigger 中。
  • 没有纯粹的 XAML 解决方案。您必须实现和使用绑定转换器。这是我第四次关闭这个问题作为重复。请停止一次又一次地问同样的问题。这里也不欢迎第二个 StackOverflow 用户帐户。
  • @Clemens,严格来说,有一个纯 xaml 解决方案:每个可能值的 cellStyle 中的 dataTrigger。但是它仅适用于有限(和更好的小)值集(例如,枚举、布尔值)
  • @ASh 我只有双倍的价值。
  • @Clemens 是一位温和派,他给予无知甚至投反对票的用户。恭喜,期待在未来几天内收到投诉。

标签: c# wpf


【解决方案1】:

1.像这样创建一个 NumberToBrush 转换器:

[ValueConversion(typeof(int), typeof(Brush))]
public class NumberToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int val = (int)value;
        if (val < 50)
            return Brushes.Red;
        if (val > 60)
            return Brushes.Green;

        return Brushes.Transparent;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

2.将其添加到您的视图资源中:

<Window.Resources>
    <wpfApplication1:NumberToBrushConverter x:Key="NumberToBrushConverter"/>
</Window.Resources>

3.使用 DataGridTemplateColumn 而不是 DataGridTextColumn 并重新定义您的 DataTemplate 以使用转换器与您的绑定值:

   <DataGrid.Columns>
            <DataGridTemplateColumn Header="X">
                <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate DataType="wpfApplication1:YourModel">
                            <TextBox Text="{Binding X}" Background="{Binding Path=X, Converter={StaticResource NumberToBrushConverter}}" />
                        </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
       </DataGrid.Columns>

【讨论】:

  • 感谢您的回答,只是出于好奇:可以创建一个类似 swith 的案例条件:switch(val){case if(val&lt;50){return Brushes.Red;}}
  • 当然,只需将 if 条件替换为 switch case
  • 你能告诉我怎么做吗?谢谢。
  • 我尝试了您的解决方案,似乎可以正常工作,但可以填充单元格而不是文本块吗?
  • 这是使用 switch case 检查范围的方法:stackoverflow.com/a/31662661/3955716
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2010-10-24
  • 2013-04-21
  • 2021-01-11
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多