问题描述
我正在尝试使用 MVVM 模式(、eactiveUI 和 MaterialDesignInXaml)编写简单的 WPF 应用程序。 在主窗口上,我有一个带有 2 个文本框的 DialogHost,然后取消和保存按钮。 该对话框存储为资源,并通过传递 Employeeviewmodel 视图模型从主窗口视图模型打开。 该视图模型仅包含 2 个属性:EmployeeSurname 和 EmployeeName(不像我所知道的真正的视图模型,而是用于对话主机并从中获取数据)。 我在单独的类中也有简单的验证规则(这里不包括),我通过 xaml 添加到我当前的文本框之一。 基本的东西验证在单个元素上工作正常,但我想实现更多,特别是:
- 如何比较 2 个或更多复选框?我无法将数据从另一个文本框传递到验证规则,它仅适用于分配规则的当前文本框。
- 如何在现有对话框之上显示另一个对话框(例如,在关闭对话框以保存更改之前要求确认) - 这是正确的方法吗?
- 如何在对话框打开时最初禁用“保存”按钮(以便在用户第一次键入正确值时启用它)? 那个看起来很简单的广告我可以很容易地使用主窗口上的命令来执行此操作,但是使用 MaterialDesignInXaml 对话框按钮中使用的路由命令我不知道如何实现这一点
XAML
<DataTemplate DataType="{x:Type local:Employeeviewmodel}">
TextBox1:
<TextBox Name="txtEmployeeName" MaxLength="8">
<TextBox.Text>
<Binding Path="EmployeeName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<VR:NameSurnameRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
TextBox2(它还没有任何验证):
<TextBox Name="txtSurname" Text="{Binding EmployeeSurname,UpdateSourceTrigger=PropertyChanged}" />
保存按钮:
<Button Content="_Login" Command="{x:Static md:DialogHost.CloseDialogCommand}" Grid.Row="1" Grid.Column="2">
<Button.CommandParameter>
<system:Boolean>True</system:Boolean>
</Button.CommandParameter>
<Button.Style>
<Style targettype="Button" BasedOn="{StaticResource {x:Type Button}}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(Validation.HasError),ElementName=txtEmployeeName}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
取消按钮
<Button Content="_Cancel" Command="{x:Static md:DialogHost.CloseDialogCommand}" Grid.Row="1" Grid.Column="0" />
那个对话框在资源中,没有代码隐藏。 提前致谢
解决方法
谢谢,那个包装器起作用了,但在测试了其他一些东西之后,我终于决定使用 https://fluentvalidation.net/ 。在那里比较字符串非常容易,我发现它非常灵活。 关于初始验证,我发现只需将 ValidatesOnTargetUpdated="True" 添加到 xaml 中的验证规则就可以了(当我使用流畅的验证时不需要):
Warning: An update to SocialPostForm inside a test was not wrapped in act(...).
When testing,code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
,
您可以使用包装器方法将某些内容传递给验证规则,很好的例子是 here。或者您可以在模型中使用 IErrorDataInfo 进行验证(或将此方法与规则验证结合使用,但在您的视图模型中附加规则)。 对于第一次验证,您可以在 ViewModel 构造函数中引发 PropertyChanged,它会强制进行第一次验证。