そのように作成された検証ルールがあります:
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 クラスからいくつかのプロパティを取得するだけです)。
私は基本的に以下のサイトに記載されていることに従っています。