首页 > 解决方案 > 对话框中的 MaterialDesignInXaml 验证 - 如何比较 2 个文本框?

问题描述

我正在尝试使用 MVVM 模式(、eactiveUI 和 MaterialDesignInXaml EmployeeViewModel 视图模型。该视图模型只包含 2 个属性:EmployeeSurname 和 EmployeeName(不像我知道的真正的视图模型,但它用于对话主机并从中获取数据)。我在单独的类中也有简单的验证规则(不包括在这里)我通过xaml添加到我的一个文本框目前。基本的东西验证在单个元素上工作得很好,但我想实现更多,特别是:

  1. 如何比较 2 个或多个复选框?我无法将数据从另一个文本框传递到验证规则,它仅适用于分配规则的当前文本框。
  2. 如何在现有对话框之上显示另一个对话框(例如,在关闭对话框以保存更改之前要求确认) - 这是正确的方法吗?
  3. 如何在打开对话框时最初禁用“保存”按钮(因此当用户第一次键入正确的值时将启用它)?那个看起来很简单的广告我很容易在主窗口上使用命令来做到这一点,但是使用 MaterialDesignInXaml 对话框按钮中使用的路由命令我不知道如何实现这一点

XAML

     <DataTemplate DataType="{x:Type local:EmployeeViewModel}">

文本框1:

                <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" />

该对话框在资源中,没有代码隐藏。提前致谢

标签: wpfmvvmmaterial-design-in-xaml

解决方案


谢谢,该包装器有效,但在测试了其他一些东西之后,我最终决定使用https://fluentvalidation.net/。在那里比较字符串非常容易,我发现它非常灵活。关于初始验证,我发现只需将 ValidatesOnTargetUpdated="True"添加到 xaml 中的验证规则就可以了(当我使用流利验证时不需要):

    <TextBox.Text>
<Binding Path="EmployeePassword2" UpdateSourceTrigger="PropertyChanged">
                                    <Binding.ValidationRules>
                                        <VR:NameSurnameRule ValidatesOnTargetUpdated="True"/>
                                    </Binding.ValidationRules>
                                </Binding>
                            </TextBox.Text>

推荐阅读