2010-11-28 3 views
1

Я хочу связать вложенное свойство или свойство зависимостей в xaml для ValidationRule в xaml, а затем на основе значения вложенного свойства или свойства зависимостей. Я хочу принять решение суммы в правиле Validation , Я не могу найти решение как передать значение привязки в правило проверки.Attached or dependecy Свойство для ValidationRule WPF

+1

Можете ли вы предоставить дополнительную информацию о том, что вы конкретно пытаетесь достичь (входные данные, ожидаемый результат и т. Д.)? – Moonshield 2010-11-28 12:35:50

ответ

2

Я предоставляю вам образец кода, который поможет вам. Я определил ValidationRule для проверки ввода пользователем texbox. Тип проверки выполняется в соответствии с одним параметром enum. Доступный тип проверки: вход пользователя не может быть пустым, пользовательский ввод должен быть числовым, пользовательский ввод должен быть IP-адресом. Второй параметр позволяет отображать конкретное предупреждающее сообщение. Как вы знаете, переменная для целей привязки должна быть DependendyProperty, поэтому здесь вы найдете класс с объявлением paramaters.

public class ValidationParams : DependencyObject 
{ 
    // Dependency Properties 
    public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", 
                          typeof(string), 
                          typeof(ValidationParams), 
                          new FrameworkPropertyMetadata(string.Empty)); 

    public static readonly DependencyProperty ValidationTypeProperty = DependencyProperty.Register("ValidationType", 
                          typeof(FieldValidationRule.EnmValidationType), 
                          typeof(ValidationParams), 
                          new FrameworkPropertyMetadata(FieldValidationRule.EnmValidationType.FieldNotEmpty)); 

    // Properties 
    [Category("Message")] 
    public string Message 
    { 
     get { return (string)GetValue(MessageProperty); } 
     set { SetValue(MessageProperty, value); } 
    } 

    [Category("ValidationType")] 
    public FieldValidationRule.EnmValidationType ValidationType 
    { 
     get { return (FieldValidationRule.EnmValidationType)GetValue(ValidationTypeProperty); } 
     set { SetValue(ValidationTypeProperty, value); } 
    } 

Тогда вот класс ValidationRule:

public class FieldValidationRule : ValidationRule 
{ 
    public enum EnmValidationType 
    { 
     FieldNotEmpty, 
     FieldNumeric, 
     FieldIPAddress 
    } 

    // Local variables and objects 
    private ValidationParams mParams = new ValidationParams(); 

    public ValidationParams Params 
    { 
     get { return mParams; } 
     set { mParams = value; } 
    } 

    // Override 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     ValidationResult objResult = null; 
     string sValue = value as string; 
     objResult = new ValidationResult(true, null); 
     switch (Params.ValidationType) 
     { 
      case EnmValidationType.FieldNotEmpty: 
       if(string.IsNullOrEmpty(sValue) == true) 
        objResult = new ValidationResult(false, Params.Message); 
       break; 
      case EnmValidationType.FieldNumeric: 
       int iValue = 0; 
       if(int.TryParse(sValue, out iValue) == false) 
        objResult = new ValidationResult(false, Params.Message); 
       break; 
      case EnmValidationType.FieldIPAddress: 
       IPAddress objValue = IPMatrix.CreateHostAddr(); 
       if(IPAddress.TryParse(sValue, out objValue) == false) 
        objResult = new ValidationResult(false, Params.Message); 
       break; 
     } 
     return objResult; 
    } 
} 

И, наконец, вот код XAML:

     <TextBox Style="{DynamicResource FieldValue}" Grid.Column="1" IsReadOnly="False"> 
         <TextBox.Text> 
          <Binding Source="{StaticResource XmlItemChannel}" XPath="@Name" Mode="TwoWay" UpdateSourceTrigger="LostFocus"> 
           <Binding.ValidationRules> 
            <data:FieldValidationRule> 
             <data:FieldValidationRule.Params> 
              <data:ValidationParams Message="{DynamicResource ERR002}" ValidationType="FieldNotEmpty" /> 
             </data:FieldValidationRule.Params> 
            </data:FieldValidationRule> 
           </Binding.ValidationRules> 
          </Binding> 
         </TextBox.Text> 
        </TextBox> 

Вы можете видеть, что параметр Сообщения будут переплетены к ресурсу, но вы может также классически связать его.

+0

Хорошая работа, но если вы попытаетесь связать ее, вы получите сообщение об ошибке «Невозможно найти управляющую ошибку FrameworkElement или FrameworkContentElement для целевого элемента». У Томаса Левеска есть ответ на этот вопрос, см. Http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ – 2013-12-19 23:53:19

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