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;
    }
}
}

オブジェクト Foo には 30 を超えるプロパティがあります (ここでは簡単に理解できるように 2 つだけ書きました)。各 DataGridTemplateColumn の CellTemplate をそれにバインドしますか?

4

1 に答える 1

0

データ型の値を宣言しない場合DataTemplate、データ型に対して暗黙的に作成できるのは 1 つだけです。x:Key

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

これは、 this のスコープ内にあるデータ型のすべてのインスタンスに自動的に適用されますDataTemplate。コントロールResourcesまたはApplication.Resourcesセクションに配置します。

更新 >>>

残念ながら、あなたはまだそれを正しく理解していないようです。元の回答を読み直すと、 の x:Key 値を宣言しないことを指定したことがわかりますDataTemplate

さらに、以前はすべての がDataTemplate同じになるとおっしゃいましたが、2 つの異なるものを追加したため、この方法は機能しなくなります。

更新 2 >>>

MSDNは、「ADataTemplateはデータ オブジェクトの視覚的な構造を説明する」と述べています。DataTemplateが 1 つのタイプのデータ オブジェクトのプロパティを表示できると言った方がわかりやすいかもしれません。ただし、値を宣言しない場合は、DataTemplateオブジェクト タイプごとに 1 つだけ定義する必要があります。したがって、特定の型に対して 1 つを定義すると、その型のすべてのインスタンスがそれに応じて自動的にレンダリングされますx:KeyDataTemplate

あなたは私に「DataTemplate複数の要素を表示するように設定する方法」を尋ねました...それが「DataTemplate定義されたデータ型の複数のインスタンスに を適用する方法」を意味する場合、答えは単純に宣言しないことx:Keyですプロパティを設定ないでください。DataGridTemplateColumn.CellTemplateこのメソッドを使用すると、各アイテムが同じUI コントロールでレンダリングされますが、各インスタンスの値は異なります。

ただし、現在質問に示されているように、「定義されたデータ型のさまざまなインスタンスを異なる方法で表示する方法」を意味する場合、答えは質問に表示されます...x:Key値とセットでそれぞれを明示的に宣言する必要がありますDataGridTemplateColumn.CellTemplateプロパティを名前付きDataTemplate.

于 2013-10-01T15:47:38.730 に答える