2016-09-13 13 views
0

DataGridに特殊な型のアイテムを表示する際に問題があります。私は最小限の例を作りました。WPF DataGrid AutoGenerateColumn基底クラスの継承

public ObservableCollection<BaseClass> Items { get; set; } 

は、今私は、すべての項目を表示したい:

public abstract class BaseClass 
{ 
    public int BaseProperty { get; set; } 
} 

//Many ChildClasses possible 
public class ChildClass : BaseClass 
{ 
    public int ChildProperty { get; set; } 
} 

私のDataContextは、すべてのアイテムのコレクションが含まれています

Let'sは、私は多くの抽象BaseClassChildClasses継承を持っていると言いますGridViewの特別な型のコレクション。タイプを除外し、私はCollectionViewSourceを作成するには:

<CollectionViewSource Source="{Binding Items}" x:Key="ChildClasses" Filter="ChildClassesFilter"/> 

そしてここCollectionViewSourceを使用して結果GridViewです:

<DataGrid ItemsSource="{Binding ChildClasses}"/> 

今私の問題は:DataGrid のみBasePropertyが示されています(AutoGenerateColumns)が自動的に表示されます。 ChildPropertyもXAMLのプロパティを記述することなくWPFに表示させるにはどうすればよいですか?

GridViewに特殊タイプのアイテムのみを表示する方法はありますか?

答えて

0

データグリッドの列に表示されるプロパティは、Itemsコレクションのすべてのエントリに存在する必要があるため、機能しません。 BaseClassで宣言されたプロパティのみが、Itemsコレクションに格納されるすべてのインスタンスに存在することが保証されています。

これは、AutoGenerateColumnsが子インスタンスの列を作成しない理由です。あなたはそれを修正する方法をいくつかのオプションがあります。

  1. が実装あなたのChildClass
  2. のインスタンスのみを取るためにあなたのコレクションを変更し、あなたのごBaseClassChildProperty、それは
  3. 使用ラッパーObjektすべて含まれていChildClass過負荷を持っています公開したいプロパティーと、ラップされたオブジェクトのタイプに基づいて正しい値とプロパティーをフェッチするようにします。
  4. ダイナミックオブジェクトとタイプ記述子を使用して、すべてのオブジェクトのプロパティを取得できます。それがどのように機能するかは、hereの例があります。
  5. XAMLで列を宣言します。
関連する問題