Правила проверки привязки WPF в TextBox - PullRequest
0 голосов
/ 30 августа 2018

Это моя первая попытка использования Binding.ValidationRules. Они работают, как и ожидалось, за исключением:

Когда я ввожу значение TextBox, например: «abc», это нормально. Когда я возвращаю буквы «c», «b», то «a» правило срабатывает, как и должно, и предупреждает меня, что TextBox пуст. Странное поведение заключается в том, что строковое свойство, к которому привязано CompanyName, по-прежнему сохраняет «a». Поэтому строка не пуста, и я не могу использовать строку. Пустое сравнение в моей бизнес-логике.

Похоже, что ValidationRule предотвращает это последнее редактирование / удаление символа в свойстве string.

Надеюсь, это имеет смысл, но я включил несколько изображений. Зеленая метка abc на изображении привязана к тому же свойству, что и TextBox.

То, что я хочу сделать, это управлять видимостью кнопки «Сохранить» на основе действительного TextBox. Я думаю, это довольно стандартно, так что я, наверное, подхожу к этому неправильно, или я упускаю что-то простое.

enter image description here

enter image description here

enter image description here

enter image description here

<TextBox x:Name="CompanyNameTextBox" Grid.Row="1" TabIndex="1" 
                     Style="{StaticResource TextBoxStyleWithError}" 
                     Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                <TextBox.Text>
                    <Binding Path="objCompanyClass.CompanyName" UpdateSourceTrigger="PropertyChanged" >
                        <Binding.ValidationRules>
                            <HelperClass:CompanyNameValidator Max="50"/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

<Style x:Key="TextBoxStyleWithError"  TargetType="TextBox">

        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                <Setter Property="Background" Value="DarkRed"/>
                <Setter Property="Margin" Value="3 15 3 3"/>
            </Trigger>
        </Style.Triggers>

    </Style>

<ControlTemplate x:Key="validationErrorTemplate">
        <DockPanel>
            <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Center" Margin="0 0 0 3">
                <TextBlock Foreground="Red" FontSize="12" Margin="2,0,0,0" 
                           Text="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">

                </TextBlock>
            </StackPanel>
            <AdornedElementPlaceholder x:Name="ErrorAdorner" ></AdornedElementPlaceholder>
        </DockPanel>
    </ControlTemplate>

C #

public class CompanyNameValidator : ValidationRule
{
    public static bool TextEntryValid = false;

    private int _max;
    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public override ValidationResult Validate (object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (string.IsNullOrEmpty(value.ToString()))
        {
            TextEntryValid = false;
            return new ValidationResult(false, "Company Name cannot be empty.");
        }

        else
        {
            if (value.ToString().Length > Max)
            {
                TextEntryValid = false;
                return new ValidationResult(false, $"Cannot be more than {Max} characters long.");
            }
        }

        TextEntryValid = true;
        return ValidationResult.ValidResult;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...