可重用的datatemplate绑定到celltemplate

时间:2013-10-01 15:29:59

标签: wpf xaml

我有以下数据网格

    <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绑定到它?

1 个答案:

答案 0 :(得分:0)

如果您没有为其声明DataTemplate值,则可以为您的数据类型创建一个隐式x:Key

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

这将自动应用于您在DataTemplate范围内的所有数据类型实例,例如。将其放在您的控件ResourcesApplication.Resources部分。

更新&gt;&gt;&gt;

不幸的是,你似乎还没有做对。如果您重新阅读我的原始答案,您应该看到我指定您不为DataTemplate声明x:键值

此外,您之前曾说过DataTemplate的所有内容都是相同的,但现在您添加了两个不同的内容,因此此方法将不再有效。

更新2&gt;&gt;&gt;

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

您问我'如何设置DataTemplate以显示其中的多个元素'...如果你的意思是'如何将DataTemplate应用于多个实例定义数据类型',答案只是不为它声明x:Key并且设置DataGridTemplateColumn.CellTemplate属性。使用此方法将使用相同的 UI控件呈现每个项目,但每个实例使用不同的值。

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