WPF访问Converter的viewmodel

时间:2012-06-11 09:00:21

标签: wpf viewmodel converter

我有一个Label,用于将用户插入的代码转换为描述。为此我在转换器中使用字典。 每次调用Converter都会填充此字典。这是一个非常难看的事情,我想在我的viewmodel中使用这个字典,但我没有想法如何从转换器访问它。

任何想法?

2 个答案:

答案 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属性。