WPF DataBinding Validation игнорируется - PullRequest
4 голосов
/ 21 июля 2010

Я (полагаю) я проверяю привязку DataBinding в виде учебника, но она просто не работает - вообще.

В отладчике метод Validate(object value, CultureInfo cultureInfo) никогда не вызывается.

Что дает?Кроме того, для бонусных баллов любые указатели на отладку WPF были бы замечательными.

Я публикую свой XAML и рассматриваемый класс

<UserControl x:Class="FooControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Foo.Controls"
         mc:Ignorable="d" 
         d:DesignWidth="300">
<Grid Name="GridFoo">
    <Grid.Resources>
        <local:ValueConverter x:Key="MyConverter" />
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBox Name="TextBoxScalar" Grid.Column="0" TextAlignment="Right">
        <TextBox.Text>
            <Binding Mode="OneWay" Path="Scalar" NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
                <Binding.ValidationRules>
                    <local:ScalarValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBlock Name="TextBlockUnit" Grid.Column="1" TextAlignment="Left" Padding="3">
        <Hyperlink>
            <!-- Use a custom converter here b/c generics break wpf... -->
            <Run Text="{Binding Mode=OneWay, Path=Unit, Converter={StaticResource MyConverter}}" />
        </Hyperlink>
    </TextBlock>
</Grid>

ValidationRule

public class ScalarValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string number = value as string;
        double d;
        return new ValidationResult(Double.TryParse(number, NumberStyles.Any, cultureInfo, out d),
            String.Format("\"{0}\" is not a number.", number));
    }
}

Ответы [ 2 ]

8 голосов
/ 21 июля 2010

Вы добавляете ValidationRule в одностороннюю привязку. Односторонние привязки никогда не передают значение в источник, поэтому проверять нечего, и ваш ValidationRule никогда не вызывается. Если вы хотите проверить данные, введенные пользователем, установите Mode="TwoWay" в вашей привязке. Вы также можете полностью опустить атрибут Mode, так как TextBox.Text по умолчанию связывается двусторонне.

Если вы действительно хотите одностороннюю привязку и хотите, чтобы проверка происходила, когда значение передается из источника (Scalar) к цели (TextBox.Text), тогда установите ValidatesOnTargetUpdated в True на ValidationRule. Вы можете сделать это в XAML или в конструкторе вашего класса ValidationRule.

0 голосов
/ 30 декабря 2015

Вам не нужно указывать режим привязки. и установите ValidatesOnTargetUpdated в false / true, в зависимости от ваших требований, так как оба работают.

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