首页 > 解决方案 > 带有 GridViewColumn 和 DataTemplate 代码的 WPF ListView

问题描述

我在 WPF 应用程序中有 ListView 和 GridView。我在 xaml 中添加了几个 Gridviewcolumn,它使用下面的代码具有 celltemplate 和 DataTemplate。

<GridView x:Name="DvGridView">
<GridViewColumn Header="Device Name" Width="200">
<GridViewColumn.CellTemplate>
 <DataTemplate>
  <TextBlock Text="{Binding DeviceName}">
<TextBlock.Background>
 <SolidColorBrush Color="{Binding DeviceColor}"/>
</TextBlock.Background>
  </TextBlock>

 </DataTemplate>
</GridViewColumn.CellTemplate>
  </GridViewColumn>
</GridView>

我想根据用户选择在后面的代码中添加 Gridviewcolumns。我试过下面的代码

GridViewColumn nameColumn = new GridViewColumn();
nameColumn.Header = columnInfo;
nameColumn.Width = 120;

var text = new FrameworkElementFactory(typeof(TextBlock));
text.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Center);

Binding binding = new Binding("DeviceColor");
binding.Source = PmcDataInfoCollection;
SolidColorBrush brush = new SolidColorBrush();
BindingOperations.SetBinding(brush, SolidColorBrush.ColorProperty, binding);
text.SetBinding(TextBlock.TextProperty, new Binding(col));
text.SetBinding(TextBlock.BackgroundProperty, binding);

DataTemplate dataTemplate = new DataTemplate();
dataTemplate.VisualTree = text;
nameColumn.CellTemplate = dataTemplate;
DvGridView.Columns.Add(nameColumn);

“DeviceColor”的 TextBlock.BackgroundProperty 绑定无法正常工作。它始终以白色显示。请让我知道如何解决此问题。

标签: c#.netwpfdata-binding

解决方案


您正在绑定ColorSolidColorBrush 的属性,但实际上并没有使用该 Brush。

因此,不要将 Binding 应用于 TextBlock 的 Background 属性,只需分配 Brush:

Binding binding = new Binding("DeviceColor");
binding.Source = PmcDataInfoCollection;

SolidColorBrush brush = new SolidColorBrush();
BindingOperations.SetBinding(brush, SolidColorBrush.ColorProperty, binding);

text.Background = brush;

为了能够将绑定直接应用于背景属性,您需要一个将颜色转换为画笔的转换器:

text.SetBinding(TextBlock.BackgroundProperty,
    new Binding
    {
        Path = new PropertyPath("DeviceColor"),
        Source = PmcDataInfoCollection,
        Converter = new ColorToBrushConverter()
    });

转换器类:

public class ColorToBrushConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new SolidColorBrush((Color)value);
    }

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

推荐阅读