1

我试图在 DataGrid 中创建一个列,它只不过是一个纯色的矩形。此列使用以下 XAML 定义。

<DataGrid x:Name="MeasurementGrid" AutoGenerateColumns="False"
          AlternatingRowBackground="Azure" SelectionUnit="FullRow"
          HeadersVisibility="Column" VerticalGridLinesBrush="AntiqueWhite"
          HorizontalGridLinesBrush="AntiqueWhite">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Rectangle Width="16" Height="16">
                        <Rectangle.Fill>
                            <SolidColorBrush Color="{Binding Path=Color, Mode=OneWay}" />
                        </Rectangle.Fill>
                    </Rectangle>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>                                
        <DataGridTextColumn Header="Energy" Width="75" Binding="{Binding Path=Energy}"></DataGridTextColumn>
        <DataGridTextColumn Header="Field Size" Width="100" Binding="{Binding Path=FieldSize}"></DataGridTextColumn>
        <DataGridTextColumn Header="Type" Width="200" Binding="{Binding Path=FriendlyType}"></DataGridTextColumn>
        <DataGridTextColumn Header="Depth" Width="75" Binding="{Binding Path=Depth}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

问题是,虽然我的这个网格的数据源确实有一个名为“Color”的属性,但我的 XAML 中定义的solidcolorbrush 没有使用这个值。可以看出,我确实有其他列也绑定了,并且在运行时进行了适当的绑定。

4

2 回答 2

1

作为 WPF 的新手,这个问题一开始并不明显。此 DataGrid 绑定到的自定义数据对象有一个名为“Color”的 System.Drawing.Color 类型的属性。由于 WPF 使用 System.Windows.Media.Color,我被迫创建自己的值转换器类。它在下面。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media;

namespace WpfTchartTest.Converters
{
    class WinFormsColorToWpfColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            System.Drawing.Color color = (System.Drawing.Color)value;

            System.Windows.Media.Color converted = System.Windows.Media.Color.FromArgb(
                color.A, color.R, color.G, color.B);

            return converted;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }
}

然后,我只需将其作为资源添加到我的用户界面,并在绑定到 WinForms“颜色”时使用以下语法...

<UserControl.Resources>
        <conv:WinFormsColorToWpfColorConverter x:Key="WinFormsColorToWpfColor" />
</UserControl.Resources>

<SolidColorBrush Color="{Binding Path=Color, Converter={StaticResource ResourceKey=WinFormsColorToWpfColor}}" />
于 2012-08-22T12:31:36.527 回答
0

对不起,我无法复制这个。

我在 Visual C# Express 2010 中创建了一个新的 WPF 应用程序,将您的 DataGrid 复制到 MainWindow.xaml,并修改了 MainWindow.xaml.cs 中的代码以包含以下内容:

using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Media;

namespace MyNamespace
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<Color> colors = new List<Color>() { Colors.Red, Colors.Green, Colors.Blue };
            MeasurementGrid.ItemsSource = colors.Select(color => new Colored() { Color = color }).ToList();
        }
    }

    public class Colored
    {
        public Color Color { get; set; }
    }
}

当我运行应用程序时,我在第一列得到了一个带有彩色矩形的网格。

(在实际应用程序中,该类Colored将实现INotifyPropertyChanged并且colors将是 aObservableCollection而不是 a List。出于本演示的目的,我们将把这些细节放在一边。)

于 2012-08-21T20:47:38.393 回答