2

MVVMパターンに従って実行時にSilverlightDataGridコントロールでDataGrid列を動的に指定する最良の方法は何ですか?

私がやりたいのは、「DataGrid.Columns」プロパティをViewModelのプロパティにバインドして、ユーザーが列を追加/削除した場合に、ViewModelプロパティを更新するだけで、DataGridが変更されるようにすることです。問題は、「DataGrid.Columns」プロパティをバインドできないことです(私は思いません)。

このプロパティは使用できず、DataGridコントロール自体もViewModelレベルで使用できないため、現在のアプローチは、この特定の実装のMVVMパターンの外に出て、ViewのコードビハインドでMVVMLightのMessengerクラスを使用して特定のイベントをキャプチャすることです。この機能を実現するには、DataGridコントロールと直接通信してください。これは詳細のないこのアプローチの一般的なステートメントですが、もっと簡単な方法はありますか...またはそれほど簡単ではないかもしれませんが、MVVMパターンに少しよく準拠するより良い方法はありますか?

DataGridコントロールのColumnsプロパティをバインドできないことに夢中になっています...とても単純なことのようです。

参考までに-AutoGenerateColumns=Trueを使用することが提案される前は、DataGrid.ItemsSourceにバインドされているコレクション内の各アイテムにバインドされているクラスには、列にバインドされているものを識別するための個別のプロパティがありません...これは、特定のパスが外れるように列を完全に動的に保つための列。また、AutoGeneratingColumnsを処理し、e.Cancelを使用して列を表示/非表示にすることも、これと同じ理由で問題があります(私は思います)。

4

1 に答える 1

1

DataGrid.Columns をバインドできないのは苦痛であることに同意します。ここでの私の推奨事項は、ObservableCollection の ViewModel で列を定義することです。ビュー (分離コード) で、この ObservableCollection の CollectionChanged イベントを処理し、コードで DataGrid.Columns を変更します。

このソリューションは洗練されていませんが、簡単です。ViewModel では、列が追加、削除、または移動されたときに CollectionChanged イベントが適切に発生することを単体テストできます。ビューのコードはテストできないので、これはあなたが一緒に暮らす必要があるものだと思います。利点は、いつの日か DataGrid.Columns プロパティをデータバインドできる場合、これをリファクタリングしてコード ビハインドを削除するのが簡単になることです。

別の方法 (私が思うに) は、アタッチされた動作またはブレンド動作を作成して、これを処理することです。それを DataGrid にアタッチします。DataGrid.Columns に直接バインドする代わりに、動作のプロパティにバインドし、動作で DataGrid (AssociatedObect) を直接変更します。

それは理にかなっていますか?乾杯、ローラン

于 2010-05-07T14:23:32.140 に答える