我正在尝试让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) 有人在回答stackoverflow问题时告诉我,MVVM模式的"两大枪"是1)附加行为和2)服务.我认为他的意思是" WPF服务 "这个短语,我发现它在以下方面使用:
PresentationFoundation.dll定义了WPF控件类型,动画和多媒体支持,数据绑定支持以及其他WPF服务.
许多这些WPF服务(解耦事件,丰富的数据绑定,样式,资源等)是软件开发最佳实践,它们集中在单个声明性UI堆栈中.
您将了解WPF背后的动机,学习XAML的语法,检查核心编程模型,并调查几个WPF服务.
我甚至没有提到"WPF服务"这样的WPF书籍,所以这只是一个词,意思是" WPF功能 ",例如分离事件,丰富的数据绑定,样式等等,或者"WPF"这个术语背后还有其他什么服务"?
我正在开发一个WPF/MVVM应用程序,我有一个列表框绑定到ViewModel中的数据.在不同的点我需要视图模型使列表框滚动到给定的元素.
如何在不创建自定义控件的情况下执行此操作,同时仍保持良好的关注点分离?
我目前通过在视图层中创建一个自定义行为类来实现它的工作,该行具有依赖项属性VisibleIndex,然后XAML代码绑定到视图模型中的整数:
<ListBox x:Name="myListBox"
local:ListBoxVisibilityBehavior.VisibleIndex="{Binding VisibleIndex}">
Run Code Online (Sandbox Code Playgroud)
设置整数时,它会触发依赖项属性更新处理程序,该处理程序告诉列表框滚动到关联的索引.
这看起来有点hacky,因为依赖属性值永远不会被列表框更改,并且更新处理程序仅在值更改时被调用,因此确保相关项可见的唯一方法是执行以下操作:
// view-model code
this.VisibleIndex = -1;
this.VisibleIndex = 10;
Run Code Online (Sandbox Code Playgroud)
我目前使用行为类的唯一原因是绑定我的自定义依赖项属性,有没有办法用事件代替这样做?