8

通常、データバインドされたコントロールを「更新」する場合は、「PropertyChanged」イベントを使用して、データが舞台裏で変更されたことをインターフェイスに通知します。

たとえば、プロパティ「DisplayText」を使用してデータコンテキストにバインドされたテキストブロックを持つことができます

<TextBlock Text="{Binding Path=DisplayText}"/>

ここから、DataContext が PropertyName "DisplayText" で PropertyChanged イベントを発生させると、このテキストブロックのテキストが更新されます (バインディングのモードを変更していないと仮定します)。

ただし、データ コンテキストから離れた多くのプロパティを使用してコントロールの最終的なルック アンド フィールを決定する、より複雑なバインディングがあります。これを実現するために、データ コンテキストに直接バインドし、コンバーターを使用します。この場合、画像ソースを使用しています。

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

ご覧のとおり、{Binding} をパスなしで使用してデータ コンテキストに直接バインドし、ImageConverter を使用して探している画像を選択します。しかし今、そのバインディングを更新するように伝える方法がありません (私が知っていることです)。「.」でpropertychangedイベントを上げてみました。機能しませんでした。

これは可能ですか?バインディングがアタッチできるプロパティに変換ロジックをラップする必要がありますか、またはバインディングをリフレッシュするように (バインディングを明示的にリフレッシュせずに) 指示する方法はありますか?

どんな助けでも大歓迎です。ありがとう!-アダム

4

3 に答える 3

21

ここでの回避策は、「Self」と呼ばれるプロパティ(データコンテキストとして使用される)をオブジェクトに追加することでした。これは単に

public Object Self { get { return this; }}

次に、バインディングでこのプロパティを使用しました。

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

それから私が電話するとき

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

それは魅力のように機能します。

皆さんありがとう。

于 2010-04-19T21:03:45.370 に答える
2

現在のコンバーターで必要なことを正確に達成する方法があるとは思いません。おっしゃったように、ViewModel で計算を行うか、コンバーターをIMulitValueConverter.

特定のシナリオ (ViewModel クラスに関連付けられたコンバーターとそのプロパティのいくつか) から、ViewModel にロジックを実装することに傾倒します。

于 2010-04-19T20:54:55.647 に答える
0

うーん、あなたは完全な実装を示していません。しかし、GUIにバインドされた値がPropertyChanged-Eventを提供する場合は、更新する必要があると思います。

よろしく

于 2010-04-19T20:38:29.127 に答える