2

xaml で validationRules を呼び出す必要があり、viewmodel (datacontext にある) プロパティを引数として渡したいと思います。どうすればそれを達成できますか?

                    <Binding.ValidationRules>
                        <vm:RiskCodeValidation/>
                    </Binding.ValidationRules> 
4

2 に答える 2

3

ValidationRule.ValidationStepをValidationStep.CommitedValueまたはValidationStep.UpdatedValueに設定すると、Validateメソッドの値パラメーターのタイプはBindingExpressionになり、BindingExpression.DataItemプロパティを使用してDataContextを取得できます。

残念ながら、バインディングソースが更新された後にのみ機能します。


次に例を示します。

public class RiskCodeValidation : ValidationRule
{
    public RiskCodeValidation()
        : base(ValidationStep.CommittedValue, true)
    {
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var expression = value as BindingExpression;
        if (expression != null)
        {
            var sourceItem = expression.DataItem;
            if (sourceItem != null)
            {
                var propertyName = expression.ParentBinding != null && expression.ParentBinding.Path != null ? expression.ParentBinding.Path.Path : null;
                var sourceValue = sourceItem.GetType().GetProperty(propertyName).GetValue(sourceItem, null);

                // TODO: do validation logic based on sourceItem, propertyName and sourceValue.
            }
        }

        return ValidationResult.ValidResult;
    }
}
于 2012-06-12T08:00:29.493 に答える
0

私は WPF ValidationRules の既知の制限に行きました。依存関係プロパティを ValidationRules のプロパティにバインドできません。この問題は、ここで説明され、解決されています (WPF の制限により、まだ見苦しい解決策です)。

http://michlg.wordpress.com/2010/01/29/wpf-custom-validationrule-with-an-additional-parameter/

http://www.codeproject.com/Articles/18678/Attaching-a-Virtual-Branch-to-the-Logical-Tree-in

http://www.11011.net/wpf-binding-properties

または、単純に System.ComponentModel.IDataErrorInfo を使用します。これを今すぐ実行します。

于 2012-06-12T07:24:56.293 に答える