我有一个Label,用于将用户插入的代码转换为描述。为此我在转换器中使用字典。 每次调用Converter都会填充此字典。这是一个非常难看的事情,我想在我的viewmodel中使用这个字典,但我没有想法如何从转换器访问它。
任何想法?
答案 0 :(得分:2)
在您的视图中,将字典绑定为资源(由ViewModel提供)。将转换器更改为IMultiValueConverter
并使用<MultiBinding>
将其绑定到您需要用于查找的值以及您正在查找的字典中。
有关获取多个输入值的转换器的详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx,以及使用<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中包含一些逻辑,以便仅在存在要使用的值时更改值,或者使值变灰这与(半完成的)代码不对应。这些是可用性的东西,你可以四处寻找最适合你应用的东西。
答案 1 :(得分:2)
如果将它放在viewmodel中,则不需要转换器。
只需在VM中公开Code
属性,然后将标签绑定到该属性即可。然后在Code
设置器中使用字典更新Description
属性。