Я хочу использовать 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();
}
}
Что я делаю не так?
Заранее спасибо