Wpf 验证两个文本框。文本值要不同

Wpf 验证两个文本框。文本值要不同,wpf,xaml,Wpf,Xaml,抓取两个文本框,说您需要验证它们的内容是不同的字符串 例如: 正确结果:prefix1,prefix2 结果不正确:prefix1,prefix1 为了完成这项任务,我曾考虑使用多重绑定,但随后出现了两个问题: 它应该放在哪里?当前它位于虚拟文本框上 即使使用该虚拟文本框,也不会调用ValidationRule 不确定这种方法是否正确,您将如何做到这一点 <MultiBinding Converter="{StaticResource MyConverter}"> <B

抓取两个文本框,说您需要验证它们的内容是不同的字符串

例如:

正确结果:prefix1,prefix2 结果不正确:prefix1,prefix1 为了完成这项任务,我曾考虑使用多重绑定,但随后出现了两个问题:

它应该放在哪里?当前它位于虚拟文本框上 即使使用该虚拟文本框,也不会调用ValidationRule 不确定这种方法是否正确,您将如何做到这一点

<MultiBinding Converter="{StaticResource MyConverter}">
    <Binding Path="GradientPrefix"
                Source="{StaticResource Indices}"
                UpdateSourceTrigger="PropertyChanged" />
    <Binding Path="ColorPrefix"
                Source="{StaticResource Indices}"
                UpdateSourceTrigger="PropertyChanged" />
    <MultiBinding.ValidationRules>
        <gpl2Xaml:DistinctStringValidationRule />
    </MultiBinding.ValidationRules>
</MultiBinding>

下面是使用BindingGroup的解决方案

BindingGroup级别出错:

BindingGroup和field级别出错:

无错误:

代码如下:

<Window>
    <Window.Resources>
        <gpl2Xaml:Indices x:Key="Indices"
                          ColorIndex="1"
                          ColorPrefix="MyColor"
                          GradientIndex="1"
                          GradientPrefix="MyColor" />
    </Window.Resources>
        <Grid DataContext="{StaticResource Indices}"
              Style="{StaticResource gridInError}"
              Validation.ErrorTemplate="{StaticResource validationTemplate}">
            <Grid.BindingGroup>
                <BindingGroup>
                    <BindingGroup.ValidationRules>
                        <gpl2Xaml:DistinctValidationRule />
                    </BindingGroup.ValidationRules>
                </BindingGroup>
            </Grid.BindingGroup>
            <TextBox x:Name="TextBoxGradientPrefix"
                     Style="{StaticResource textBoxInError}"
                     TextChanged="TextBoxGradientPrefix_OnTextChanged"
                     Validation.ErrorTemplate="{StaticResource validationTemplate}">
                <Binding Path="GradientPrefix"
                         Source="{StaticResource Indices}"
                         UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <gpl2Xaml:StringValidationRule />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox>
            <TextBox x:Name="TextBoxColorPrefix"
                     Style="{StaticResource textBoxInError}"
                     TextChanged="TextBoxColorPrefix_OnTextChanged"
                     Validation.ErrorTemplate="{StaticResource validationTemplate}">
                <Binding Path="ColorPrefix"
                         Source="{StaticResource Indices}"
                         UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <gpl2Xaml:StringValidationRule />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox>
        </Grid>
</Window>
以及验证规则:

public class DistinctValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var bindingGroup = value as BindingGroup;
        if (bindingGroup == null) return new ValidationResult(false, "Not a BindingGroup");

        var o = bindingGroup.Items[0] as Indices;
        if (o == null) return new ValidationResult(false, "Not an Indices");

        if (o.ColorPrefix == o.GradientPrefix)
            return new ValidationResult(false, "Color prefix and Gradient prefix must be distinct.");

        return new ValidationResult(true, null);
    }
}

您似乎缺少validationTemplate的定义。
public class DistinctValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var bindingGroup = value as BindingGroup;
        if (bindingGroup == null) return new ValidationResult(false, "Not a BindingGroup");

        var o = bindingGroup.Items[0] as Indices;
        if (o == null) return new ValidationResult(false, "Not an Indices");

        if (o.ColorPrefix == o.GradientPrefix)
            return new ValidationResult(false, "Color prefix and Gradient prefix must be distinct.");

        return new ValidationResult(true, null);
    }
}