用户界面与MVVM的交互

时间:2009-07-01 21:03:26

标签: c# wpf mvvm prism viewmodel

我做了一些谷歌搜索并没有找到这个难题的答案。

如果您有以下内容:

  • MySuperView
  • MySuperViewModel

MySuperView有两个文本框,它们都绑定到ViewModel上的字符串属性 并使用DelegateCommand将“保存”按钮绑定到ViewModel,使用如下语法:

视图模型:

this.SaveOrderCommand = new DelegateCommand<object>(this.Save, this.CanSave);

查看:

Command="{Binding SaveOrderCommand}"

如何处理UI元素以使用户交互更令人满意。例如,假设在DelegateCommand的保存操作期间发生了一些较低级别的故障,并且您希望触发其中一个TextBox的工具提示。这通常会如何发生?

我希望尽可能坚持使用干净的代码,但我并不反对将特定于UI的代码放在那里。

3 个答案:

答案 0 :(得分:6)

我建议您的ViewModel实现IDataErrorInfo,以便您可以利用WPF中的验证内容。你不需要等到有人点击保存按钮,一旦文本框得到更新,它就会被验证。

public string this[ColumnName]
{
  if (Column == "TextProperty")
  {
    if(!ValidateTextProperty())
      return "TextProperty is invalid";
  }
}

void Save(object param)
{
  if (CanSave)
  {
     if (string.IsNullOrEmpty(this["TextProperty"])
     {
        //Add Save code here
     }
  }
}

在您的视图中:

    <TextBox Text={Binding TextProperty, ValidateOnDataErrors="true",
 UpdateSourceTrigger=PropertyChanged}/>

这会在文本框周围放置一个红色框,您可以在文本框样式中添加验证错误模板以添加工具提示,请参阅 here

答案 1 :(得分:1)

要在工具提示中显示异常,我会向ViewModel添加一个属性,该属性将错误消息公开为字符串,并将其绑定到TextBox的工具提示。然后在Save方法中,首先将该属性设置为空字符串,然后在try..catch中执行所有实际工作,如果发生异常,则将异常消息推送到该属性中,以便自动显示在工具提示中。

您需要为您的属性提供更改通知,方法是将其设置为DependencyProperty或使用INotifyPropertyChanged。

答案 2 :(得分:0)

基本上,您希望视图的创建属性能够观察(通常通过触发器),这将根据代码执行中发生的情况更新UI。