Ошибки проверки Catel не отображаются в представлении - PullRequest
0 голосов
/ 12 января 2019

У меня проблема с Catel при отображении результатов проверки полей (выполненных в модели представления или модели) в представлении: с ошибкой в ​​поле соответствующее текстовое поле должно быть помечено как красная рамка. Но почему-то у меня это не получается.

Это очень упрощенный тестовый сценарий с моделью представления, имеющей 2 целочисленных поля, и правилами проверки, для которых оба значения должны иметь значения <100: </p>

    public class MainViewModel : ViewModelBase
    {
        public MainViewModel() : base()
        { }

        protected override async Task InitializeAsync()
        {
            await base.InitializeAsync();
        }

        protected override async Task CloseAsync()
        {
            await base.CloseAsync();
        }

        public override string Title { get { return "Test"; } }


        public int Value1
        {
            get { return GetValue<int>(Value1Property); }
            set { SetValue(Value1Property, value); }
        }
        public static readonly PropertyData Value1Property = RegisterProperty(nameof(Value1), typeof(int), 42 );

        public int Value2
        {
            get { return GetValue<int>(Value2Property); }
            set { SetValue(Value2Property, value); }
        }
        public static readonly PropertyData Value2Property = RegisterProperty(nameof(Value2), typeof(int), 99);


        protected override void ValidateFields(List<IFieldValidationResult> validationResults)
        {
            if (Value1 >= 100)
            {
                validationResults.Add(FieldValidationResult.CreateError(Value1Property, "Value1 must be < 100" ));
            }

            if (Value2 >= 100)
            {
                validationResults.Add(FieldValidationResult.CreateError(Value1Property, "Value2 must be < 100"));
            }
        }

        protected override void ValidateBusinessRules(List<IBusinessRuleValidationResult> validationResults)
        {  }
    }
}

Обратите внимание: в моем реальном проекте поля и валидация будут в модели, но по соображениям теста я сократил это до простого вида и модели вида.

И этот простой вид имеет модель представления в виде текста данных:

<catel:Window x:Class="WPF_Catel_Validation.Views.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
              xmlns:catel="http://schemas.catelproject.com">

    <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
        <TextBox Text="{Binding Value1, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Width="100" />
        <TextBox Text="{Binding Value2, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Width="100" />
    </StackPanel>    
</catel:Window>

Связь между view и viewmodel работает. Представление также показывает ошибку, когда в текстовое поле вводится нечисловой текст. Модель представления с методом ValidateFields () также идентифицирует любые ошибки, но представление не показывает эти ошибки проверки с красной рамкой вокруг текстового поля.

Я провел свои тесты с Catel 5.8.0 и .NET 4.7.2. Мне немного интересно, как ViewModelBase класса Catel может реализовать INotifyDataErrorInfo, но событие ErrorsChanged не отображается в этом классе. Но в целом я понятия не имею, если что-то не так с моей моделью представления, или моим представлением, или с Catel, или чем-то еще? Я также не нашел никакой современной документации по Catel. Любые предложения высоко ценятся - спасибо!

1 Ответ

0 голосов
/ 12 января 2019

Возможно, вам нужно установить DeferValidationUntilFirstSave в false, если вы хотите показать их немедленно.

...