Ситуация:

Когда вы нажимаете на новый продукт, появляется всплывающий экран:

enter image description here

Как видите, кнопка «Opslagen» отключена, это хорошо, потому что «Productnaam» является обязательным.

Теперь, если я начну печатать, кнопка «Опслаг» включена, пока все в порядке.

enter image description here

Но когда я удаляю текст, сообщение красным цветом показывает, что это поле является обязательным, но кнопка больше не отключается:

enter image description here

Когда я снова что-то печатаю, красный текст снова исчезает. Но поведение кнопки работает не так, как ожидалось.

XAML:

<TextBox Width="200"
         Height="30"
         HorizontalAlignment="Left"
         VerticalContentAlignment="Center">
    <TextBox.Text>
        <Binding Path="ProductName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <validators:EmptyValidationRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <StackPanel>
                <!-- Placeholder for the TextBox itself -->
                <AdornedElementPlaceholder x:Name="textBox"/>
                <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
            </StackPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
</TextBox>

Класс EmptyValidationRule:

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    if (value == null)
    {
        return new ValidationResult(true, null);
    }

    if (!string.IsNullOrEmpty(value.ToString()) && !string.IsNullOrWhiteSpace(value.ToString()))
    {
        return new ValidationResult(true, null);
    }

    return new ValidationResult(false, "Dit veld is verplicht.");
}

И, наконец, свойство IsSaveButtonDisabled в ViewModel:

public bool IsSaveButtonEnabled
{
    get
    {
        if (!string.IsNullOrEmpty(_productName) && !string.IsNullOrWhiteSpace(_productName))
        {
            return true;
        }
        else
        {
            return false;
        }
    }    
}

Я действительно понятия не имею,. Это должно быть сочетание ValidationRule и проверки, является ли свойство ProductName пустым.

Изменить, код кнопки:

<Button Content="Opslagen"
        IsEnabled="{Binding IsSaveButtonEnabled}"
        Background="Bisque"
        Width="120"
        Height="30"
        Command="{Binding SaveCommand}" />

ProductName свойство:

private string _productName;
public string ProductName
{
    get => _productName;
    set
    {
        _productName = value;

        RaisePropertyChanged(nameof(ProductName));
        RaisePropertyChanged(nameof(IsSaveButtonEnabled));
    }
}

Команда Сохранить выглядит так:

SaveCommand = new RelayCommand(SaveProduct);

А SaveProduct - это всего лишь метод сохранения продукта. Этот материал работает.

0
user7849697 7 Май 2021 в 16:50

1 ответ

Лучший ответ

Установите для свойства ValidationStep значение UpdatedValue, чтобы запустить ValidationRule после установки свойства источника:

<validators:EmptyValidationRule ValidatesOnTargetUpdated="True"
                                ValidationStep="UpdatedValue" />

Затем следует вызвать событие PropertyChanged для свойства IsSaveButtonEnabled и отключить Button, даже если правило проверки не выполняется.

1
mm8 10 Май 2021 в 12:48