Прикрепленное или зависимое свойство для ValidationRule WPF - PullRequest
1 голос
/ 28 ноября 2010

Я хочу связать вложенное свойство или свойство зависимости в xaml для ValidationRule в xaml, а затем на основе значения присоединенного свойства или свойства зависимости, которое я хочу принять решение по сумме в правиле проверки. Я не могу найти решение Как передать связываемое значение в правило валидации.

1 Ответ

2 голосов
/ 20 июня 2011

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

    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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...