3

ユーザーが挿入したコードを説明に変換するラベルがあります。そのために、コンバーター内で Dictionary を使用しています。このディクショナリは、サービスをスローするコンバータへのすべての呼び出しで埋められます。これは本当に醜いことです。ビューモデルにこの辞書を入れたかったのですが、コンバーターからアクセスする方法がわかりません。

何かアイデアはありますか?

4

2 に答える 2

2

ビューで、ディクショナリをリソースとしてバインドします (ViewModel によって提供されます)。コンバーターを an に変更し、IMultiValueConvertera<MultiBinding>を使用して、ルックアップに使用する必要がある値と、ルックアップする辞書の両方にバインドします。

複数の入力値を受け取るコンバーターの詳細<MultiBinding>.

または、GazTheDestroyer が提案したように、ViewModel に配置します。

class MyViewModel : INotifyPropertyChanged
{

   public MyViewModel()
   {
      // Call service to populate _dictionary here...
   }

   private Dictionary<string, string> _dictionary;
   private string _code;

   public string Code
   {
      get { return _code; }
      set
      {
         _code = value;
         Description = _dictionary[_code];
         if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Description"));
      }
   }

   public string Description { get; set; }
}

また、コンバーターを介してバインドする代わりに、Description プロパティにバインドします。

アップデート

更新に関する質問に答えるには、XAML のバインドを少し変更して、UpdateSourceTrigger を変更する必要があります。Text プロパティのデフォルトは、コントロールがフォーカスを失うと更新され、値が変更されるたびに次のように変更されます。

<TextBox Text="{Binding Code,UpdateSourceTrigger=PropertyChanged}" />

詳細については、http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspxを参照してください。

ここでエラー検証を追加する必要がある場合があります。キーストロークごとに Description の値が変更されるため、ViewModel にロジックを含めて、使用する値がある場合にのみ値を変更するか、使用しない値をグレー表示することができます。 (中途半端な)コードに対応します。これらは使いやすさの問題ですが、アプリケーションに最適なものを見つけるために試してみることができます。

于 2012-06-11T09:04:12.953 に答える
2

ビューモデルに入れると、コンバーターは必要ありません。

CodeVM でプロパティを公開し、それにラベルをバインドするだけです。次に、Codeセッターで辞書を使用してDescriptionプロパティを更新します。

于 2012-06-11T09:11:58.790 に答える