我有一个标签,可以将用户插入的代码转换为描述。为此,我在转换器内使用字典。每次调用 Converter throw a Service 时都会填写此字典。这是一件非常丑陋的事情,我想在我的视图模型中有这本字典,但我不知道如何从转换器访问它。
有什么想法吗?
在您的视图中,将字典绑定为资源(由 ViewModel 提供)。将转换器更改为 anIMultiValueConverter
并使用 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}" />
进一步阅读可在http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
您可能需要在此处添加一些错误验证 - 每次击键都会更改 Description 的值,因此您可能希望在 ViewModel 中包含一些逻辑,以便仅在有要使用的值时更改值,或者将不使用的值变灰对应(半成品)代码。这些都是可用性方面的东西,您可以四处寻找最适合您的应用程序的东西。
如果将它放在视图模型中,则不需要转换器。
只需Code
在 VM 中公开一个属性并将标签绑定到该属性。然后在Code
设置器中,您使用字典来更新您的Description
属性。