1


0

次のコード例では、スライダーをドイツ語から英語に移動して、テキストブロックが実行時に翻訳されることを確認できます。

  • * string *にバインドされたTextBlockのみが更新されます

  • * Dictionary *にバインドされたTextBlockは更新されません。

Viewは単に* Dictionaryオブジェクトを*一度取得するだけで、それ以降は更新されないようです。 私は* Mode = TwoWay *を試しましたが、それは効果がありません。

_objects_にバインドされた要素がバインディングによって更新されるようにするにはどうすればいいですか?*

見解:


  • ViewModel:*

System.Collections.Genericを使用します。

名前空間TestObjectUpdate234.ViewModels {パブリッククラスMainViewModel:ViewModelBase {

#region ViewModelProperty:TranslationEditプライベート文字列_translationEdit;パブリック文字列TranslationEdit {get {return _translationEdit;} }

set {_translationEdit = value;} OnPropertyChanged( "TranslationEdit"); #endregion

#region ViewModelProperty:翻訳プライベート辞書_translations = new Dictionary();パブリック辞書の翻訳{get {return _translations;}} }

set {_translations = value;} OnPropertyChanged( "Translations"); #endregion

#region ViewModelProperty:LanguageIndex private int _languageIndex; public int LanguageIndex {get {return _languageIndex;}} }

set {_languageIndex = value; OnPropertyChanged( "LanguageIndex"); FillTranslations(); #endregion

public MainViewModel(){_languageIndex = 0; //英語FillTranslations();

}

private void FillTranslations(){if(_languageIndex == 0){TranslationEdit = "編集";

Translations.Clear(); Translations.Add( "add"、 "Add"); } else {TranslationEdit = "Bearbeiten";

Translations.Clear(); Translations.Add( "add"、 "Hinzufügen"); }

}

}}

2 Answer


2


ObservableListと同等の辞書が必要です。 Frameworkにはデフォルトではありませんが、書く方法の1つを説明した記事が ここ

コードが現状のままでは機能しない理由は、Translations DictionaryのセッターでNotifyPropertyChangedイベントを発生させるためですが、FillTranslationsメソッドは新しいDictionaryを作成しないため、セッターは呼び出されず、イベントは発生しません。発射しない 新しいディクショナリを作成し、それを割り当ててイベント全体をリスト全体で再バインドすると、ObservableDictionaryクラスを回避できると思いますが、長い目で見れば、同じディクショナリインスタンスを保持してコントロールに通知するほうが効率的です。コレクションはObservableパターン(辞書にINotifyCollectionChangedを実装する)によって変更されました


1


代わりにObservableCollection <>を使用する必要があります。

変更が発生したときはWPFバインダーに通知する必要があります。辞書のプロパティが設定されている場合はOnPropertyChangedを呼び出しますが、辞書内の値が変更されたことをバインダーに通知する理由も必要です。 ObservableCollection <>がこれを行います。 項目がコレクションに追加または削除されたときにイベントを発生させます。