0

少し背景: ControlPresenter と呼ぶクラスにロードするプロパティ (コントロール タイプ、ラベル、マージンなど) のテーブルに格納されているデータベースから WPF UI をロードしています。基本的に、ControlPresenter を ContentPresenter の DataContext として設定し、TemplateSelector を使用して、読み込むコントロールのタイプを選択します。DataTemplate は、ControlPresenter によって公開された DependencyProperties からプロパティをロードします。

これはすべて非常にうまく機能します。私が直面している問題は、他のプレゼンター (INotifyPropertyChanged を実装する通常のプロパティを持つ) のデータ (たとえば、TextBox の Text プロパティをプレゼンターの Name プロパティにバインドする) をこれらのコントロールにバインドしようとすると発生します。コントロールの DataContext は関連付けられた ControlPresenter であるため、他のプレゼンターに直接バインドできず、同じ依存関係プロパティに 2 つのバインドを設定できません (コントロールと目的のプレゼンター プロパティを同じ DP にバインドできません)。 .

可能な解決策:

  1. 他のすべてのプレゼンターを DP を使用するように変換できます (非常に時間がかかり、継承で問題が発生する傾向があります)。
  2. 通過させたいプロパティごとに 2 つの DP を使用し、変更された通知を通じてそれらを結び付けようとすることができます

これらはどちらも問題があり、壊れやすいように見えるので、他の誰かがより良い解決策を思いついたことを願っています.

編集:かなりうまく機能するソリューションを思いつきました(以下を参照)。これを見てくれたみんなに感謝します。私よりも良い方法を思いついたら教えてください。

4

2 に答える 2

0

Binding.Source を目的の ViewModel に設定し、Binding.Path のデータベース内のパスを使用して、コードでバインディングを設定することになりました。バインディングを Dictionary(Of DependencyProperty, BindingBase) に格納し、コントロールが読み込まれると、BindingOperations.SetBinding を使用してコントロールにバインディングを設定します。これは、時折の操作順序の問題を除いて、かなりうまくいくようです (たとえば、ItemsSource の前に SelectedItem/SelectedValue を設定すると、設定されますが、ComboBox には表示されません)。

于 2009-04-25T18:48:27.160 に答える
0

範囲外の DataContext にアクセスするには、いくつかの方法があります。

1) ElementNameバインディング

ほとんどの現実世界のシナリオでは、バインドしようとしているものはとにかく名前範囲外であるため、これはおそらく最も役に立ちません。ただし、フレームワーク要素が名前スコープ内にある限り、これは並列または親のデータ コンテキストにアクセスする方法です。

<TextBox Text="{Binding ElementName=ControlSomewhereElseBoundToSomeOtherControlPresenter, Path=DataContext.SomeTextPropertyOnTheControlPresenter}" />

2) RelativeSource バインディング

これは #1 に似ていますが、RelativeSource を使用して適切なビジュアル要素に移動し、DataContext を取得します。もちろん、これは、取得しようとしている DataContext が、現在ビジュアル ツリーにいる場所よりも上にあることを前提としています。

3) 静的リレーを使用する

ViewModel のファサードとして機能する静的クラス内で代替の ControlPresenters を公開できます。次に、各 ViewModel 内で、静的メソッド/プロパティに渡されるインスタンス プロパティを構築します。これは、複数のビュー モデル間で共有ストレージを実現するための一般的な方法です。この手法ではパターンを少し変更する必要があることは承知していますが、これらの「ControlPresenter」クラスに単純な ViewModel ラッパーを追加することは、説明したオプションよりもはるかに単純に思えます。

于 2009-04-16T08:02:17.240 に答える