Пользовательское правило проверки WPF и элементы управления - PullRequest
1 голос
/ 07 февраля 2012

В пределах ItemsControl, который связан с источником данных, я пытаюсь проверить TextBox, используя пользовательское правило проверки, которое принимает параметр, ниже приведен код для правила vaildation.

public class RatioValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (!String.IsNullOrEmpty(Maturity.MaturityValue) && Helper.IsDateInCorrectFormat(Maturity.MaturityValue))
        {
            String strVal = Convert.ToString(value);
            Double ratio = 0;
            Boolean isValid = Double.TryParse(strVal, out ratio);
            if (isValid)
            {
                if (ratio <= 0)
                    return new ValidationResult(false, "Please enter a valid ratio!");
                else return new ValidationResult(true, null);
            }
            return new ValidationResult(false, "Please enter a valid ratio!");
        }
        else return new ValidationResult(true, null);           
    }

    private MaturityDependencyForValidation _maturity;
    public MaturityDependencyForValidation Maturity
    {
        get { return _maturity; }
        set { _maturity = value; }
    }
}

public class MaturityDependencyForValidation : DependencyObject
{
    public String MaturityValue
    {
        get { return (String)GetValue(MaturityValueProperty); }
        set { SetValue(MaturityValueProperty, value); }
    }

    public static readonly DependencyProperty MaturityValueProperty =
        DependencyProperty.Register("MaturityValue", typeof(String), typeof(MaturityDependencyForValidation), new UIPropertyMetadata(null));

}

А затем используйте его следующим образом:

<TextBox Grid.Row="1" Grid.Column="2"  Name="txtRatio" BorderThickness="0" Width="148" Tag="{Binding StrMaturity, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Text>
        <Binding Path="Ratio" Mode="TwoWay"  UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <leg:RatioValidation ValidatesOnTargetUpdated="True">
                    <leg:RatioValidation.Maturity>
                         <leg:MaturityDependencyForValidation MaturityValue="{Binding txtMaturity}"/>
                    </leg:RatioValidation.Maturity>
                </leg:RatioValidation>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

В окне вывода получено исключение:

Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.BindingExpression: Path = txtMaturity;DataItem = NULL;целевым элементом является MaturityDependencyForValidation (HashCode = 63478077);Целевым свойством является 'Maturity' (тип 'String')

И в правиле RatioValidation значение Maturity никогда не связывается с привязкой данных.Мне нужно это значение для привязки данных.Пожалуйста, помогите.

1 Ответ

1 голос
/ 07 февраля 2012

Нет DataContext, так как окружающие объекты, по крайней мере, привязка, не DependencyObjects, вы несколько ограничены в выборе, это должно быть похоже на то, что происходит, когда связывание в массиве , также см. этот ответ .

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