Неправильное поведение с Catel & FluentValidation с вложенными моделями - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу использовать FluentValidation с Catel для проверки моей модели. Чтобы объяснить лучшие вещи, я создал репо здесь

Идея:

  • У меня есть основная модель представления с вложенной моделью представления, которая использует соглашение Catel.
  • У меня есть нижний колонтитул, который должен разрешать выполнение команд на основе проверки (в реальном случае, например, printотчет, когда все необходимые значения заполнены

Проблема, с которой я сталкиваюсь, заключается в том, что если я заполняю перед свойством MainViewModel свойство вложенного, проверка вложенного завершается неудачно (даже если я установил. SetValidator () для вложенной модели. Если заполнить перед вложенной, то основная проверка завершится успешно.

Вот MainView

 <Grid x:Name="LayoutRoot" Background="LightGreen">
           <Grid.RowDefinitions>
               <RowDefinition Height="30"></RowDefinition>
               <RowDefinition Height="30"></RowDefinition>
               <RowDefinition Height="30"></RowDefinition>
           </Grid.RowDefinitions>
         <StackPanel Orientation="Horizontal">
             <Label Content="Text"></Label>
             <TextBox Text="{Binding TextMessage, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Width="120" ></TextBox>
         </StackPanel>
        <views:InnerView DataContext="{Binding Inner}" Grid.Row="1"></views:InnerView>
        <views:FooterView Grid.Row="2"></views:FooterView>

    </Grid>

и MainViewModel

public class MainWindowViewModel : ViewModelBase
    {

        private readonly ISelectedModelService selectedModelService;
        [ViewModelToModel]
        public string TextMessage { get; set; }

        [ViewModelToModel]
        public  InnerModel Inner { get; set; }

        [Model]
        public MainModel Model { get; set; }

        public MainWindowViewModel(ISelectedModelService selectedModelService)
        {
            this.selectedModelService = selectedModelService;
            DeferValidationUntilFirstSaveCall = false;



            Model = new MainModel();

            selectedModelService.Model = Model;
        }

    }

* * * * * * * * * * * * * * * * * * * * *1020* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * [10код (я уменьшил внутреннюю модель грехау него есть только DateTime? свойство)

 public class FooterViewModel : ViewModelBase
    {
        private readonly ISelectedModelService selectedModelService;
        public Command ClickCommand { get; set; }

        public FooterViewModel(ISelectedModelService selectedModelService)
        {
            this.selectedModelService = selectedModelService;
            ClickCommand = new Command(OnClickCommandExecute, CanClickCommandExecute);
        }

        private bool CanClickCommandExecute()
        {
            var m = selectedModelService.Model.GetValidationContext();

            return !m.HasErrors;
        }

        private void OnClickCommandExecute()
        {


        }

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

            selectedModelService.Model.Validated += Model_Validated;
        }

        private void Model_Validated(object sender, ValidationEventArgs e)
        {
            this.ClickCommand.RaiseCanExecuteChanged();
        }
    }

Что я делаю не так?

Заранее спасибо

...