我有一个标签,可以将用户插入的代码转换为描述。为此,我在转换器中使用字典。此字典在每次调用转换器时都会填充,从而抛出服务。这是一件非常丑陋的事情,我想在我的视图模型中拥有这个字典,但我不知道如何从转换器访问它。
有什么想法吗?
在您的视图中,将字典绑定为资源(由 ViewModel 提供)。将转换器更改为IMultiValueConverter
,并使用<MultiBinding>
将其绑定到需要用于查找的值以及要查找的字典。
有关采用多个输入值的转换器的更多信息,以及将一个输入值与<MultiBinding>
一起使用的示例,请参阅 http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx 。
或者,正如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 中的绑定以更改更新源触发器。Text 属性的默认值是在控件失去焦点时更新,这将在每次值更改时将其更改为:
<TextBox Text="{Binding Code,UpdateSourceTrigger=PropertyChanged}" />
更多阅读可在 http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
您可能需要在此处添加一些错误验证 - 每次击键都会更改"说明"的值,因此您可能希望在 ViewModel 中包含一些逻辑,以便仅在有值可供使用时才更改该值,或者将与(半成品)代码不对应的值灰显。不过,这些都是可用性的东西,你可以尝试找到最适合你的应用程序的东西。
如果你把它放在视图模型中,你就不需要转换器了。
只需在 VM 中公开一个Code
属性,并将标签绑定到该属性。然后在Code
资源库中,您可以使用字典更新Description
属性。