0

そのように作成された検証ルールがあります:

public class TagFitsConstraintRule : ValidationRule
{
    public TagDependencyObject SelectedTag { get; set; }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Tag tag = SelectedTag.Tag;

        if (tag != null)
        {
            if (tag.TagConstraintPattern == null)
            {
                return ValidationResult.ValidResult;
            }
            else
            {
                // Perform additional validation for the tag
            }
        }
        else
        {
            return new ValidationResult(false, "No tag selected.");
        }
    }
}

Dependency オブジェクトは次のように定義されます。

public class TagDependencyObject : DependencyObject
{
    public static readonly DependencyProperty TagProperty = DependencyProperty.Register("Tag", typeof(Tag), typeof(TagDependencyObject), new UIPropertyMetadata(null));

    public Tag Tag
    {
        get { return (Tag)GetValue(TagProperty); }
        set { SetValue(TagProperty, value); }
    }
}

そして、私はそれをXAMLで次のように使用しています:

<Window
...>
<Window.Resources>
    <d:TagDependencyObject x:Key="TagDependencyObject" Tag="{Binding CurrentlySelectedTag}"/>
</Window.Resources>
...
<TextBox ... >
    <TextBox.Text>
        <Binding Path="CurrentlySelectedTag" Converter="{StaticResource TagDataConverter}" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <c:TagFitsConstraintRule ValidatesOnTargetUpdated="True" SelectedTag="{StaticResource TagDependencyObject}"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
...

そして、なんらかの理由で頭を悩ませているようには見えませんが、TagDependencyObject の Tag プロパティは、null に設定されても動じません。バインディング モード、UpdateSourceTrigger を操作しようとしましたが、何も機能していないようです。ウィンドウ上の他のコンポーネントが適切に動作しているため、ViewModel のプロパティが設定されているという事実を知っています。また、ValidationRule が実行される前に ViewModel プロパティが設定されていることも確認しました。私は何を間違っていますか?

おそらく、私が気づいていない、やりたいことを行うためのはるかに良い方法があるので、私は代替案を受け入れることができるので、私は意図的に質問を私がしたように言いました. 私の最終的な目標は、上記の XAML にリストされている TextBox で検証を提供することですが、実際の検証を行うには、TextBox 内のテキストだけでは不十分です (Tag クラスからいくつかのプロパティを取得するだけです)。

私は基本的に以下のサイトに記載されていることに従っています。

サイト 1 サイト 2

4

1 に答える 1

0

コンバーターを使用してこれを行うことができました。IMul​​tiValueConverter を使用したので、必要な各プロパティをコンバーターに渡すことができました。

コンバータ:

public class MyCoolConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Logic
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

バインディング:

<TextBox Text="{Binding CurrentlySelectedTag.TagData, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Style>
        <MultiBinding Converter="{StaticResource TagDataValidationStyleSelector}" UpdateSourceTrigger="PropertyChanged">
            <Binding Path="CurrentlySelectedTag"/>
            <Binding Path="CurrentlySelectedTag.TagData" UpdateSourceTrigger="PropertyChanged"/>
        </MultiBinding>
    </TextBox.Style>
</TextBox>

そして、ドキュメントではあまり説明されていないように見える検証部分...検証でValidateOnDataErrors = trueを設定してコンバーターから例外をスローすることにより、入力に同様の赤いボックスアウトラインの視覚的エラーが発生しますデフォルトのように見えるテンプレート。

于 2013-11-12T16:06:07.093 に答える