我正在尝试让WPF验证在MVVM模式下工作.
在我的视图中,我可以验证像这样的TextBox,它由代码隐藏方法"HandleError"处理,工作正常:
<TextBox Width="200"
Validation.Error="HandleError">
<TextBox.Text>
<Binding Path="FirstName"
NotifyOnValidationError="True"
Mode="TwoWay">
<Binding.ValidationRules>
<validators:DataTypeLineIsValid/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
但是,我想通过DelegateCommand处理我的ViewModel中的验证,但是当我使用以下代码尝试它时,我得到显式错误" '{Binding HandleErrorCommand}'不是有效的事件处理程序方法名.只有实例方法生成的或代码隐藏的类是有效的. "
有没有解决方法,以便我们可以处理MVVM模式中的验证?
视图:
<TextBox Width="200"
Validation.Error="{Binding HandleErrorCommand}">
<TextBox.Text>
<Binding Path="FirstName"
NotifyOnValidationError="True"
Mode="TwoWay">
<Binding.ValidationRules>
<validators:DataTypeLineIsValid/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
视图模型:
#region DelegateCommand: HandleError
private DelegateCommand handleErrorCommand;
public ICommand HandleErrorCommand
{
get
{
if (handleErrorCommand == null)
{
handleErrorCommand = new DelegateCommand(HandleError, CanHandleError);
}
return handleErrorCommand;
}
}
private void HandleError()
{
MessageBox.Show("in view model");
}
private bool CanHandleError()
{
return true;
} …Run Code Online (Sandbox Code Playgroud) 这是前一个问题的后续问题,它并没有真正让我到处: WPF中的确定性和异步字段验证
由于WPF似乎不支持INotifyDataErrorInfo,我需要自己实现类似的东西(如果我错了,请纠正我).我需要这个,因为我希望ViewModel触发何时为某些字段显示特殊的ErrorTemplates(例如,在单击按钮之后或在长时间运行异步验证操作结束之后或当内部状态以某些字段突然显示的方式更改时)失效).
我正在考虑为此编写自定义标记扩展或行为.它监听我INotifyDataErrorInfo的ViewModel实现的版本,并在ErrorsChanged引发事件后从XAML中定义的特殊的已知ErrorTemplate创建一个VisualTree .
一旦我在XAML中定义了该模板,我如何从我的行为/表达中找到它,从中实现一个实际的可视化树,然后在我表单上的右侧字段条目中显示它(可能以某种方式在一个装饰层上)?