0

カスタム コントロールをゼロから ( を使用してGraphics) 作成しています。これは、それぞれがセルのリストを持つ一連の列を表します。グリッド ビューとよく似ていますが、これにはいくつかのカスタム機能があります。

すべてのデータ バインディングの問題を管理する方法を見つけようとして苦労しています。このグリッドには、DataSource基本的に、コントロール内のセルにバインドする必要があるいくつかのオブジェクトのギザギザ配列 (2D) である必要があるプロパティが必要です。これらの各オブジェクトがどのようなプロパティを持つかはまだわかりません。今のところ、テキストのみを使用しています。私がやろうとしているのは、モデルにこのインターフェースを実装させることです:

public interface IDiagramDataSource
{
    IBindingList Columns { get; }
}

次に、各列にこれを実装させます。

public interface IDiagramColumnDataSource : INotifyPropertyChanged
{
    IBindingList Cells { get; }
}

しかし、これらすべてのオブジェクトをグリッド内の対応するオブジェクトと同期させる最善の方法を見つけるのにまだ苦労しています。すべての拘束力のある混乱を独立したクラスに入れたいと思っていますが、これを行う方法がわかりません。今のところ、データ ソースに変更があるたびに全体を再描画するだけですが、最終的には、どのセルのどのプロパティまたはどの列のどのセルが変更されたかを特定して、更新のみできるようにしたいと考えています。私のグリッドに必要なアイテム。

コントロールをネストされたリストにバインド可能にする場合に従うべきパターンはありますか? DataGridViewコントロールがこれを行うので、あると思います。

4

1 に答える 1

0

私は2つのオプションを提案します:

最初の提案は、HighCore によって提案されました。カスタムの winform オブジェクトではなく、WPF を使用してジョブを実行することです。WPF にはさらに多くのコントロールがあります (ListView、一般的な ItemContainer でさえ、私が間違っていなければ)。ViewModel で INotifyPropertyChanged を実装し、コントロールを更新する必要があるたびにルート (集計) 要素の OnPropertyChanged を呼び出すだけです。ItemsSource Binding に UpdateSourceTrigger を追加することを忘れないでください。WPF コントロールには、ドラッグ アンド ドロップ機能の適切な実装もあります。

WPF での実装については、説明している記事がたくさんあるので詳しく説明しません。

ただし、カスタム グラフィック描画で行う必要があると考えると、非常に複雑になります。変更を有効にするには、項目リストで変更が発生するたびに、コントロール グラフィックを再描画するメソッドをトリガーする必要があります。グラフィックを部分的に更新できれば (おそらくパネルを使用してそれをだますことができれば) 改善されますが、それはより困難です。

正しく処理されない場合 (さらに、コントロールに大量のデータやコントロール サイズが含まれている場合)、メモリ負荷が高くなる可能性があります。

于 2013-03-11T05:18:49.457 に答える