icustomtypedescriptorを介したWPF Datagrid AutoColumn Generation
-
02-10-2019 - |
質問
テストプロジェクトでは、次のシナリオでWPF Datagrid列を自動誘導することができました。ここでは、データは辞書に保存され、BindingはPropertyDescriptorsを介して実行されます。
public class People:List<Person>{
...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{
}
私が抱えている問題は私の実生活のプロジェクトで私がMVVMを使用しているので、それは 人々ViewModelbaseを継承するため、リストを継承できないViewModelu003CPerson> 。 Ilistを実装しようとしましたu003CPerson>代わりに内部リストを使用しますu003CPerson>データコンテキストを明示的にILISTに設定しますu003CPerson>参照しますが、それはうまくいきませんでした。
私は勝利を拘束することに関する同様の投稿を見てきましたdatagridview ここ, 、ですから、同じ種類のロジックがWPFで適用され、主にicustomtypedescriptorの実装がリストを継承するときに正確に取り上げられるのか疑問に思っていますu003CT>単にILISTを実装すると、それは欠落していますu003CT>代わりは。
解決
DataGrid
使用します CollectionView
コレクションがプロパティを生成します。より具体的には、キャストします CollectionView
に IItemProperties
, 、デフォルト CollectionView
実装していません。実装しない場合 IList
(一般的なものではありません)、デフォルト CollectionView
使用されます。
したがって、非遺伝子を実装します IList
インターフェイスはこれを解決する必要があります(List<T>
両方を実装するため、あなたが派生した場合に機能する理由です List<Person>
).
他のヒント
まだ言及されていないので、私は関連する問題がありました。 DataGrid
行がなかったときに自動生成されていませんでした。それは DataGrid
私を見ていませんでした IItemProperties
実装はまったくあります(理由はわかりません)が、純粋に使用していました ICustomTypeDescriptor
個々の行の実装は、列を生成するために機能しますが、それは動作しますが、行がない場合は列がありません。
解決策は実装することでした ITypedList
(私は去りました IItemProperties
コレクションタイプでの実装も備えて)。今、私は行があるかどうかにおいて、私のために適切に生成された列を取得します。