0

2 つの TextBox を取得し、それらのコンテンツが別個の文字列であることを検証する必要があるとします。

例 :

  • 正解:prefix1、prefix2
  • 間違った結果: prefix1, prefix1

そのタスクを実行するには、MultiBinding を使用することを考えましたが、次の 2 つの問題が発生します。

  • どこに置くべきですか?現在、ダミーのTextBoxにあります
  • そのダミーの TextBox を使用しても、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>
4

1 に答える 1

1

BindingGroup を使用したソリューションは次のとおりです。

BindingGroup レベルでのエラー:

ここに画像の説明を入力

BindingGroup およびフィールド レベルでのエラー:

ここに画像の説明を入力

エラーなし:

ここに画像の説明を入力

コードは次のとおりです。

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

毎回検証をトリガーする追加のコード:

    private void TextBoxGradientPrefix_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        grid.BindingGroup.CommitEdit();
    }

    private void TextBoxColorPrefix_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        grid.BindingGroup.CommitEdit();
    }

そして検証ルール:

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);
    }
}
于 2013-06-09T16:13:24.143 に答える