1

次の System.Windows.ValidationRule を使用しています。

public class XXXValidationRule : ValidationRule
{
    public object FooObject { get; set;}
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Bar barObject = this.FooObject.BarObject;
    }
}

私のXAMLはこのように表示されます。

<ui:Windows.Resources>
    <ResourceDictionary>
       <viewModel:XXXValidationRule x:key="xxxValidationRule"/>
    </ResourceDictionary>
</ui:Windows.Resources>
...
<TextBox.Text>
    <Binding Path="..." UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>                   
            <viewModel:XXXValidationRule/>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

ここまでは順調ですね。XAML ダイアログのコード ビハインドで、次のように ValidationRule を初期化します。

public partial class XamlDialog : System.Windows.Window
{
    private System.Windows.Controls.ValidationRule xxxValidationRule;

    public XamlDialog()
    {
        InitializeComponent();
        InitializeResources();
    }

    public void InitializeResources()
    {
       this.xxxValidationRule = (ValidationRule)this.Resources["xxxValidationRule"];
       this.xxxValidationRule.FooObject= new FooObject();
    }
    ...
 }

ポイントは、XXXValidationRule.Validate がトリガーされると、FooObject プロパティが常に null になることです。

Property FooObject の値型 int を使用すると、同じ効果が得られます。

値の型 int を引き続き使用し、次のように XAML でプロパティを明示的に設定すると、検証規則内で正しい値 (99) を受け取ります。

<Binding.ValidationRules>
    <viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...

まず、ValidationRule は値型のみをサポートしていますか、それとも上記のように参照型を操作する方法はありますか? 次に、そのようなプロパティを XAML で明示的に設定する必要がありますか、それともコード ビハインドで設定する方法はありますか?

手伝ってくれてありがとう :-)

4

1 に答える 1

1

ちょうど解決策を見つけました。dkozl のコ​​メントとこの stackoverflow の回答に感謝しますhttps://stackoverflow.com/a/3173461/3835909

次のような検証ルールを定義すると、

<Binding.ValidationRules>
    <viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...

BindingBinding.ValidationRulesが の新しいインスタンスを常に作成することを意味しますXXXValidationRule。それを解決するには、次のように使用StaticResourceします。

<Binding.ValidationRules>
    <StaticResource ResourceKey="xxxValidationRule"/>
</Binding.ValidationRules>
...
于 2015-03-11T15:35:01.270 に答える