3

我有一个标签,可以将用户插入的代码转换为描述。为此,我在转换器内使用字典。每次调用 Converter throw a Service 时都会填写此字典。这是一件非常丑陋的事情,我想在我的视图模型中有这本字典,但我不知道如何从转换器访问它。

有什么想法吗?

4

2 回答 2

2

在您的视图中,将字典绑定为资源(由 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 中包含一些逻辑,以便仅在有要使用的值时更改值,或者将不使用的值变灰对应(半成品)代码。这些都是可用性方面的东西,您可以四处寻找最适合您的应用程序的东西。

于 2012-06-11T09:04:12.953 回答
2

如果将它放在视图模型中,则不需要转换器。

只需Code在 VM 中公开一个属性并将标签绑定到该属性。然后在Code设置器中,您使用字典来更新您的Description属性。

于 2012-06-11T09:11:58.790 回答