ユーザーが挿入したコードを説明に変換するラベルがあります。そのために、コンバーター内で Dictionary を使用しています。このディクショナリは、サービスをスローするコンバータへのすべての呼び出しで埋められます。これは本当に醜いことです。ビューモデルにこの辞書を入れたかったのですが、コンバーターからアクセスする方法がわかりません。
何かアイデアはありますか?
ビューで、ディクショナリをリソースとしてバインドします (ViewModel によって提供されます)。コンバーターを an に変更し、IMultiValueConverter
a<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}" />
ここでエラー検証を追加する必要がある場合があります。キーストロークごとに Description の値が変更されるため、ViewModel にロジックを含めて、使用する値がある場合にのみ値を変更するか、使用しない値をグレー表示することができます。 (中途半端な)コードに対応します。これらは使いやすさの問題ですが、アプリケーションに最適なものを見つけるために試してみることができます。
ビューモデルに入れると、コンバーターは必要ありません。
Code
VM でプロパティを公開し、それにラベルをバインドするだけです。次に、Code
セッターで辞書を使用してDescription
プロパティを更新します。