0

我有以下数据网格

    <DataGrid x:Name="dataGrid1"
              AutoGenerateColumns="False"
              ItemsSource="{Binding}">
        <DataGrid.Resources>
            <DataTemplate DataType="{x:Type DataTypes:Foo}" x:Key="dTemp">
                <TextBox Background="{Binding BgColor}" Text="{Binding Path=RowId}"/>
                </DataTemplate>
            <DataTemplate DataType="{x:Type DataTypes:Foo}" x:Key="dTemp2">
                <TextBox Background="{Binding BgColor}" Text="{Binding Path=Alias}"/>
            </DataTemplate>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTemplateColumn CellTemplate="{StaticResource dTemp}"/>
            <DataGridTemplateColumn CellTemplate="{StaticResource dTemp2}"/>
        </DataGrid.Columns>
    </DataGrid>

在代码隐藏中我有:

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

namespace WpfApplication1
{
public partial class MainWindow : Window
{
    public ObservableCollection<Foo[]> ObservableCollection;
    public MainWindow()
    {
        InitializeComponent();
        this.ObservableCollection = new ObservableCollection<Foo[]>();

        Foo[] ocoll = new Foo[3];
        ocoll[0] = (new Foo(1, "FIRST ARRAY FIRST ROW FIRST COLUMN", Brushes.Aqua));
        ocoll[1] = (new Foo(2, "FIRST ARRAY FIRST ROW SECOND COLUMN", Brushes.Red));
        ocoll[2] = (new Foo(3, "FIRST ARRAY FIRST ROW THIRD COLUMN", Brushes.Green));

        Foo[] ocoll2 = new Foo[3];
        ocoll2[0] = (new Foo(4, "SECOND ARRAY SECOND ROW FIRST COLUMN", Brushes.Aqua));
        ocoll2[1] = (new Foo(5, "SECOND ARRAY SECOND ROW SECOND COLUMN", Brushes.Red));
        ocoll2[2] = (new Foo(6, "SECOND ARRAY SECOND ROW THIRD COLUMN", Brushes.Green));

        this.ObservableCollection.Add(ocoll);
        this.ObservableCollection.Add(ocoll2);

        dataGrid1.DataContext = ObservableCollection;
    }
}

public class Foo
{
    public int RowId { get; set; }
    public string Alias { get; set; }
    public Brush BgColor { get; set; }

    public Foo(int rowId, string @alias, Brush bgColor)
    {
        this.RowId = rowId;
        this.Alias = alias;
        this.BgColor = bgColor;
    }
}
}

Object Foo 有 30 多个属性(我在这里只写了 2 个以便于理解).. 问题是:我真的必须定义 30 个不同的数据模板(如 dTemp、dTemp2、...见上文)来将每个 DataGridTemplateColumn 的 CellTemplate 绑定到它?

4

1 回答 1

0

如果您不为其声明值,则DataTemplate只能为您的数据类型创建一个隐式:x:Key

<DataTemplate DataType="{x:Type DataTypes:YourDataType}">
    <TextBox Text="{Binding TextDescription}" Background="{Binding Color}" />
</DataTemplate>

这将自动应用于 this 范围内的所有数据类型实例DataTemplate,例如。把它放在你的控制ResourcesApplication.Resources部分。

更新>>>

不幸的是,你似乎仍然没有做对。如果您重新阅读我的原始答案,您应该会看到我指定您没有DataTemplate.

此外,您之前说所有的DataTemplates 都相同,但现在您添加了两个不同的,因此该方法将不再有效。

更新 2 >>>

MSDN声明“ADataTemplate描述了数据对象的视觉结构”。如果它说 aDataTemplate可以显示一种数据对象的属性可能会更清楚。但是,如果您不为其声明值,则DataTemplate每个对象类型只需要定义一个。因此,如果您为特定类型定义一个,则该类型的所有实例都将根据该类型自动呈现x:KeyDataTemplate

您问我“如何设置在DataTemplate其中显示多个元素”...如果您的意思是“DataTemplate如何x:Key它的值,不要设置DataGridTemplateColumn.CellTemplate属性。使用此方法将使用相同的UI 控件呈现每个项目,但每个实例的值不同。

但是,如果您的意思是“如何以不同方式显示已定义数据类型的不同实例”,如您的问题中所示,那么答案将显示在您的问题中......您必须明确声明每个实例都有一个x:Key值并设置DataGridTemplateColumn.CellTemplate命名的属性DataTemplate

于 2013-10-01T15:47:38.730 回答