WPF ValidationTule с проблемой параметров привязки - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно передать значение привязки в мое правило проверки.Это код XAML:

    <Label Grid.Column="11" Content="Default" Style="{StaticResource labelStyle2}" x:Name="txtTipo" />
<TextBox Grid.Column="12" Style="{StaticResource txtDataStyle1}" Width="100" TextChanged="Data_TextChanged">
    <Binding Path="ConfigObject.Edit.Default" UpdateSourceTrigger="Default">
        <Binding.ValidationRules>
            <local:GenericValidationRule>
                <local:GenericValidationRule.Wrapper>
                    <local:Wrapper TipoInterno="{Binding ElementName=txtTipo, Path=Content}"/>
                </local:GenericValidationRule.Wrapper>
            </local:GenericValidationRule>
        </Binding.ValidationRules>
    </Binding>
</TextBox>

Кодовое обозначение:

    public class GenericValidationRule : ValidationRule
{
    public Wrapper Wrapper { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var xx = Wrapper.TipoInternoProperty;   //TEST
        return new ValidationResult(is_valid, error_context);
    }
}

public class Wrapper : DependencyObject
{
    public static readonly DependencyProperty TipoInternoProperty = DependencyProperty.Register("TipoInterno", typeof(string), typeof(Wrapper), new PropertyMetadata(string.Empty));
    public string TipoInterno
    {
        get { return (string)GetValue(TipoInternoProperty); }
        set { SetValue(TipoInternoProperty, value); }
    }
}

В принципе я не могу получить требуемое значение в свойстве TinoInterno.Если я жестко закодирую значение, например:

<local:Wrapper TipoInterno="TEST" />

, свойство будет правильно оценено.В первом случае мне нужно передать свойство Content элемента управления elementName txtTipo.Что не так?

1 Ответ

0 голосов
/ 18 октября 2018

Вы должны получить значение TipoInterno экземпляра Wrapper в ValidationRule:

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    string s = Wrapper.TipoInterno;
    return ...;
}

Затем вы можете выполнить привязку, используя x:Reference:

<local:Wrapper TipoInterno="{Binding Path=Content, Source={x:Reference txtTipo}}"/>
...