我有以下数据网格
<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绑定到它?
答案 0 :(得分:0)
如果您没有为其声明DataTemplate
值,则可以为您的数据类型创建一个隐式x:Key
:
<DataTemplate DataType="{x:Type DataTypes:YourDataType}">
<TextBox Text="{Binding TextDescription}" Background="{Binding Color}" />
</DataTemplate>
这将自动应用于您在DataTemplate
范围内的所有数据类型实例,例如。将其放在您的控件Resources
或Application.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
。