2009-04-15 10 views
0

少し背景:私はControlPresenterを呼び出すクラスにロードするプロパティ(コントロールの種類、ラベル、余白など)のテーブルに格納されているデータベースからWPF UIを読み込みます。基本的には、ControlPresenterをContentPresenterのDataContextとして設定し、TemplateSelectorを使用してロードするコントロールのタイプを選択します。 DataTemplateは、ControlPresenterによって公開されるDependencyPropertiesからプロパティを読み込みます。"パススルー"データバインディングを実装するにはどうすればよいですか?

これはすべて非常にうまく動作します。これらのコントロールに(INotifyPropertyChangedを実装する通常のプロパティを持つ)他のプレゼンターのデータ(TextBoxのTextプロパティなど)をプレゼンターのNameプロパティにバインドしようとすると、実行している問題が発生します。コントロールのDataContextは関連するControlPresenterなので、他のプレゼンターに直接バインドすることはできず、同じ依存プロパティで2つのバインディングを設定することはできません(コントロールと希望のプレゼンタープロパティを同じDPにバインドできません) 。

考えられる解決策:

  1. 私は他の発表者のすべてが(継承に問題が発生することは非常に時間がかかると発生しやすい)のDPを使用するように変換することができ
  2. 私は、各プロパティの2つのDPを使用することができますI通過し、変更の通知

これらのいずれもが、私は他の誰かがより良いSを打ち出している願っていますので、破壊に問題となりやすいようですを通じてそれらを一緒に結び付けるために試してみたいですolution。

編集:私は、かなりうまくいく(下記参照)ソリューションを考え出しました。これを見てくれた皆さん、ありがとうございました。もしあなたが私よりも優れた方法を考え出すなら、教えてください。

答えて

0

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

0

範囲外のDataContextにアクセスする方法はいくつかあります。 elementNameがこれはおそらく最も現実世界のシナリオでは、として最も有用です

バインディング

1)は、とにかく名前スコープの外にあるにバインドしようとしているもの。しかし、これは、Framework Elementがnamescope内にある限り、パラレルまたは親のData Contextにアクセスする方法です。

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

2)RelativeSourceこれは#1と同様である

結合が、適切な視覚要素に移動してのDataContextをつかむためにRelativeSourceを使用。もちろん、これは取得しようとしているDataContextが、現在Visual TreeにあるABOVEであることを前提としています。

3)はあなたのViewModelににファサードとして動作する静的クラス内で、あなたの代わりControlPresentersを公開する可能性が静的リレー

を使用してください。次に、各ViewModel内で、静的メソッド/プロパティに渡すインスタンスプロパティを作成します。これは、複数のビューモデル間で共有ストレージを実現するための一般的な方法です。このテクニックではパターンを少し変更する必要がありますが、これらの "ControlPresenter"クラスの周りに単純なViewModelラッパーを追加することは、説明したオプションよりもはるかに簡単です。

+0

ええと、3番のオプションが働くかどうかは分かります。 –

関連する問題