我做了一些谷歌搜索并没有找到这个难题的答案。
如果您有以下内容:
MySuperView有两个文本框,它们都绑定到ViewModel上的字符串属性 并使用DelegateCommand将“保存”按钮绑定到ViewModel,使用如下语法:
视图模型:
this.SaveOrderCommand = new DelegateCommand<object>(this.Save, this.CanSave);
查看:
Command="{Binding SaveOrderCommand}"
如何处理UI元素以使用户交互更令人满意。例如,假设在DelegateCommand的保存操作期间发生了一些较低级别的故障,并且您希望触发其中一个TextBox的工具提示。这通常会如何发生?
我希望尽可能坚持使用干净的代码,但我并不反对将特定于UI的代码放在那里。
答案 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。