从代码中设置CellStyle

时间:2013-01-16 12:45:22

标签: c# wpf datagrid converter datagridviewcellstyle

我想根据它的值更改单元格内容文本字体和颜色,但我需要从代码中添加列。问题是该表显示了HEX值而不是为单元格值着色。

我在XAML资源中添加了:

<Style x:Key="MyStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="{Binding TextColor}" />
</Style>

并且以下代码行初始化列:

DataGridTextColumn column = new DataGridTextColumn();
                        column.Header = field.name;
                        column.Binding = new Binding(field.name)
                        {
                            Mode = BindingMode.TwoWay,
                            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                            Converter = new NameToBrushConverter()
                        };
                        column.ElementStyle = this.FindResource("MyStyle") as Style;
                        dgwDataMain.Columns.Add(column);

我的自定义功能:

public class NameToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((string)value == "asd") ? Brushes.Red : Brushes.Black;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Binding.DoNothing;
        }
    }

1 个答案:

答案 0 :(得分:2)

您可以使用MultiValueConverter实现此目的。

示例:

DataGridTextColumn column = new DataGridTextColumn();
column.Header = "Name";
column.Binding = new Binding("Name")
{
      Mode = BindingMode.TwoWay,
      UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged                
};
column.ElementStyle = this.FindResource("MyStyle") as Style;
grid.Columns.Add(column);

List<Foo> _source = new List<Foo> 
{
        new Foo{ Name ="test1"},
        new Foo{ Name ="test2"},
        new Foo{ Name ="test3"}
};

grid.ItemsSource = _source;

Foo类:

class Foo
{
   public string Name { get; set; }       
}

样式XAML:

<local:NameToBrushConverter x:Key="nameToBC" />

<Style x:Key="MyStyle" TargetType="{x:Type TextBlock}">
   <Setter Property="Foreground" >
            <Setter.Value>
                 <MultiBinding Converter="{StaticResource nameToBC}" >                       
                       <Binding Path="." />                      
                 </MultiBinding>
             </Setter.Value>
    </Setter>
</Style>

MultiValueConverter代码:

 class NameToBrushConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            Foo item = values[0] as Foo;
            if (item != null)
            {               
                if (item.Name == "test2")
                    return Brushes.Red;
                else
                    return Brushes.Black;
            }

            return Brushes.Black;
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }