2010-11-28 52 views
0

各コントロールのDataContextを 'this'に設定して、さまざまな機能を持つ多数のUserControlを作成しました。私はいつも問題を抱えていたが、もっと使いやすい小さな「内部の」UserControlsに分割しようとしていた。問題は次のとおりです。DataContextを設定しないときのWPFバインディングの問題

DataContextが 'this'に設定されている場合、DependencyPropertiesである必要はありません。通常のプロパティにバインドするとき、プログラムの実行はコードの背後に入ります。ここでは、ListBoxアイテムの切り替えやxamlでできないその他のことができます。

元のコントロールでホストされている新しい「内部」UserControlを作成し、内部のコントロールにこれらのプロパティを移動すると、元のものからバインドできるように、DependencyPropertiesにアップグレードする必要がありますコントロール。 DependencyPropertiesにバインドするとき、プログラムの実行は決してコードを入力せず、私にとってはこれが問題です。ところで、私は内部コントロールのDataContextを設定する代わりにルート要素のNameプロパティを設定し、内部コントロールのプロパティのバインディングでElementName = UserControlName構文を使用します。

ValidateValueCallbackHandlerをDependencyPropertyに追加して、バインドされた値が変更されたときにコードにアクセスできるようにすることはできますが、静的メソッドでなければなりません。私のクラス全体)。

たとえば、ListBoxesにTimeSegmentsオブジェクトを表示するDurationPickerコントロールがあります。 TimeSegmentsオブジェクトは、基本的にTimeSegmentオブジェクトのObservableCollectionであり、TimeSegmentにはStartDate、EndDate、およびDurationプロパティがあります。 ComboBoxから値にバインドされたDurationPickerコントロールにMinutesPerSegmentプロパティがあります。それは完璧に働いた。私はComboBoxの値を変更することができ、コードビハインドは正しい新しい値を持つTimeSegmentオブジェクトの正しい数をListBoxに配置します。

次に、TimeSegmentsオブジェクトとそれを表示するListBoxを含む内部コントロールを作成しました。 MinutesPerSegmentプロパティはDependencyPropertyになっていたので、外部コントロールからプログラムにバインドできるようになりました。プログラムの実行でコードが入力されないようになりました。コレクションのTimeSegmentオブジェクトの数を変更できません。

もう1つ注意してください。私は正常に内部コントロールのDependencyPropertiesに外部コントロールからバインドできます - 私はUIで表示される変更を見ることができます。問題は、特定のバウンドプロパティが更新されたときにコードを入力するためにプログラムの実行が必要なことです。

これを行う正しい方法は何ですか?どうもありがとう。

EDIT - この例では、外部コントロールにTimeSegmentsオブジェクトを作成し、内部コントロールにバインドしても機能します。これは、外部コントロールのMinutesPerSegmentプロパティが通常のプロパティであるためです...しかし、各TimeSegmentsオブジェクトを内部のTimeSegmentsRowコントロールで処理する必要があります。

答えて

0

最初に、DataContextthisをカスタムコントロールのプロパティにバインドできるように設定する必要はありません。誰かがあなたのコントロールのために別のデータコンテキストを設定することを決めた場合、それは悪い考えです。代わりに相対バインディングを使用できます。GetValueSetValueを超えた任意の追加のロジックがあってはならない理由

{Binding Path=PathToProperty, 
     RelativeSource={RelativeSource AncestorType= 
         {x:Type namespaceAlias:typeOfYourControl}}} 

とXAMLでカスタムコントロールの名前空間のエイリアスを宣言

xmlns:namespaceAlias="clr-namespace:YourLibraryNamespace;assembly=YourLibraryAssemblyName" 

第二に、wpf will not use your property getter and setter to access your dependency propertiesは、それはです。プロパティが変更されたときにロジックを追加するためにプロパティを登録するときに、PropertyChangedCallbackを指定することができます。

+0

DataContext = thisについてのヒントはありますが、UserControlルート要素の名前を付けてElementNameを使用するのと同じではありませんか?また、PropertyChangedCallbackデリゲートはValidateValueCallbackのように静的なので、そこからクラスメンバーにアクセスすることはできません。関係のないデータバインドされたプロパティが変更されたときに非静的メソッドを呼び出す方法がないと言っていますか? – Sheridan

+1

'PropertyChangedCallback'静的メソッドは、最初のパラメータで' DependencyObject'を受け取ります。この 'DependencyObject'はあなたのコントロールですので、コントロールタイプにキャストしてすべてのメンバーを使用することができます。 –

+0

それは私が後にしたものでした!どうもありがとうございます! :) – Sheridan

関連する問題