【问题标题】:wpf color the cells in DataGrid Based on valuewpf根据值为DataGrid中的单元格着色
【发布时间】:2012-04-05 08:52:16
【问题描述】:

我想根据单元格包含的值更改单元格的文本颜色 我使用了一个值转换器,但不知何故,传递给 Convert 函数的对象类型是 DataRowView,我想传递 Cell,因为我想根据其值一次突出显示一个单元格。希望这是有道理的。

谢谢!!

我应用到 DataGrid 的样式的代码:

<UserControl.Resources>
    <local:MyBkColorConverter x:Key="bkColorCvrt"/>
    <Style x:Key="GridStyle" TargetType="DataGrid">
        <Setter Property="ItemsSource" Value="{Binding}" />
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="RowBackground" Value="Transparent" />
        <Setter Property="HeadersVisibility" Value="None" />
        <Setter Property="GridLinesVisibility" Value="None" />
        <Setter Property="SelectionUnit" Value="Cell" />
        <Setter Property="SelectionMode" Value="Single" />
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="HorizontalScrollBarVisibility" Value="Disabled" />
        <Setter Property="CellStyle">
            <Setter.Value>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Foreground">
                        <Setter.Value>
                            <Binding Converter="{StaticResource bkColorCvrt}"/>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Black">
                            </Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Setter.Value>
        </Setter>
      </Style>
</UserControl.Resources>

还有 c# 部分:

公共类 MyBkColorConverter : IValueConverter { #region IValueConverter 成员

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //The type of value here is actually DataRowView
        //here i would like to have a cell passed. is that possible to archive?
        return Brushes.LightGray;
    }

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

    #endregion
}

【问题讨论】:

    标签: c# wpf ivalueconverter


    【解决方案1】:

    如果您创建一个将应用于每个控件的样式匹配该类型。

    只需使用 DataGridTemplateColumn 并创建您可以随心所欲的自定义模板。

      <DataGridTemplateColumn Header="Name">                       
          <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Foreground="{Binding Name,Converter={StaticResource colconverter}}" Text="{Binding Name}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
    

    【讨论】:

    • 我的网格绑定到DataTable,所以我自己没有定义任何列。我在哪里粘贴这段代码?
    • 如果您知道哪些列正在进入您的源行,那么您可以像上面一样绑定它。例如,您有员工数据表,而名称是列,那么上面的内容就可以正常工作。
    【解决方案2】:

    如果您将Path 传递给需要在Binding 中转换的属性,它会起作用。

    <DataGridTextColumn Binding="{Binding Path=AgentUtilization, StringFormat=P}" Header="Agent Utilization">
        <DataGridTextColumn.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Foreground" Value="{Binding Path=AgentUtilization, Converter={StaticResource UtilizationFormat}}" />
            </Style>
        </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
    

    然后,传递给转换器的类型就是绑定路径中的属性类型(当然,在转换之后)。

    【讨论】:

    • 我的网格绑定到 DataTable,所以我自己没有定义任何列。我在哪里粘贴这段代码?
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2022-12-08
    • 2017-04-22
    • 2020-06-02
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多