我正在使用MVVM编写一个WPF应用程序。我正在尝试了解如何正确使用此模式进行关注点验证。例如,我的应用程序将管理有关文章的数据。当用户插入新行时,第一步验证将标记所需的控件,如商品代码、数量、描述、增值税。。。
但还有第二步验证由模型执行:例如,我应该检查供应商是否提供代码文章。我需要调用一个(或多个(Web服务,而此操作只能由模型完成。好吧,当我得到一个不正确的结果(即文章不可用(时,我需要将其返回到视图模型和视图。我不想只显示一条消息,在这种情况下,我想装饰代码文章文本框。。。或者我至少想把重点放在文本框上!
但是。。。我怎么能没有";中断";mvvm模式?模型可以返回字符串结果,但模型对viewmodel一无所知,而viewmodel对avout view一无所知。。。所以…当我从Web服务获得结果时,我可以返回字符串结果,我可以显示一个带有字符串结果的消息框,但我如何引用视图中的代码文章文本框来设置焦点或用红线装饰文本框?
显然,这只是一个例子,问题是是否有可能创建一个";链接";(通过绑定?(传递给vm-m的数据和ui中的控件之间。。。
不幸的是,您没有显示任何代码,所以我不知道您是否可以将其应用于您的解决方案。但这里有一种方法可以解决它。假设用户必须输入一个文章id:
<Label Content="Article ID"/>
<TextBox Text="{Binding ArticleID}"/>
<Label Content="{Binding ArticleIdVerification}" Foreground="{Binding ArticleIdForeground}"/>
您的视图模型可能是这样的(为了简洁起见,我忽略了必须实现INotifyPropertyChanged
(:
// Viewmodel
public int ArticleID { get; set; }
public string ArticleIdVerification { get; set; }
public SolidColorBrush ArticleIdForeground { get; set; }
我想象用户按下一个按钮;验证";。然后视图模型调用模型中的一个方法来验证完整的输入。这个模型方法可能是这样的。它返回一个对象,该对象包含有关输入是否正常的所有信息:
// Model
public async Task<VerificationResult> Verify(string articleId)
{
var result = new VerificationResult();
if(await ArticleIsAvailable(articleId)
{
result.ArticleAvailable = true;
}
// also verify other stuff, and add this to your result DTO
return result;
}
现在,在您的视图模型调用此方法后,它必须设置所有属性:
// Viewmodel
private async void Verify() // this method is called by your ICommand implementation when the button is clicked
{
var result = await model.Verify(ArticleID);
if(result.ArticleAvailable)
{
ArticleIdVerification = "OK";
ArticleIdForeground = Brushes.Green;
}
else
{
ArticleIdVerification = "Article not available";
ArticleIdForeground = Brushes.Red;
}
}
如果你还想用错误的输入来聚焦文本框,你可以勾选这个问题:MVVM聚焦到文本框