2012-06-11 2 views
2

Мне нужно выполнить следующий вызов в xaml в validationRules, и я хотел бы передать в качестве аргумента свойство viewmodel (то есть в datacontext). Как я мог добиться этого?WPF pass Свойство ViewModel для проверки

    <Binding.ValidationRules> 
         <vm:RiskCodeValidation/> 
        </Binding.ValidationRules> 
+0

Я знаю, что может на самом деле atribute постоянного значения свойству RiskCodeValidation, но у меня нет никакого ideian, как передать Atributte модели представления х - viewmodel - это datacontext окна. – Louro

ответ

3

Если вы установите ValidationRule.ValidationStep на ValidationStep.CommitedValue или ValidationStep.UpdatedValue, параметр value в методе Validate будет иметь тип BindingExpression, и вы можете получить DataContext с свойством BindingExpression.DataItem.

К сожалению, он работает только после обновления источника привязки.


Вот пример:

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; 
    } 
} 
+0

Я думаю, что я действительно не понял ваше решение. Вы говорите, что в классе ValidationRule я могу сделать что-то вроде «BindingOperations.GetBindingExpression (target, property)»? – Louro

+0

Нет, см. Мой отредактированный ответ для примера. – Stipo

+0

И могу ли я получить доступ к другому свойству из окна DataContext, кроме того, который проверяется? – Louro

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 - будет следовать этому один сейчас.

Смежные вопросы