#c_sharp #wpf #mvvm #валидация #model
Есть 2 SelectedModels: SelectedCanvas { public CanvasModel {get;set;} } SelectedImage { public ImageModel {get;set;} } , каждая из которых содержит свою модель: CanvasModel { public double CanvasWidth {get;set;} public double CanvasHeight {get;set;} } ImageModel { public double X {get;set;} public double Y {get;set;} } Свойства выбранной CanvasModel(Width, Height) должны накладывать ограничения на свойства выбранной ImageModel(X,Y), на которую байндятся несколько View-моделей. Вопрос: как правильнее организовать валидацию, с учетом того, что прямой связи между выбранными моделями нет?
Ответы
Ответ 1
Ориентируясь на Свойства выбранной CanvasModel(Width, Height) должны накладывать ограничения на свойства выбранной ImageModel(X,Y), на которую байндятся несколько View-моделей. я бы сделал как-нибудь так public class MainVM : BaseVM { private CanvasVM _selectedCanvas; public CanvasVM SelectedCanvas { get { return _selectedCanvas; } set { // Тут, по-хорошему, тоже надо проверять на доспустимость выбора, если SelectedImage != null _selectedCanvas = value; RaisePropertyChanged("SelectedCanvas"); } } private ImageVM _selectedImage; public ImageVM SelectedImage { get { return _selectedImage; } set { if (/*Проверка на допустимость выбора с учетом SelectedCanvas*/) { // Ошибка, недопустимое значение throw new ArgumentException("Такой Image не подойдет!"); } _selectedImage = value; RaisePropertyChanged("SelectedImage"); } } } Где ImageVM - ViewModel для ImageModel CanvasVM - ViewModel для CanvasModel MainVM - ViewModel, в которой происходит работа по установке SelectedImage и SelectedCanvas. А View я бы привязывал к MainVM.Ответ 2
Расскажу как был решен вопрос, может кому-то пригодится. Был выделен интерфейс IBounds { Width { get;set; } Height { get;set; } } от него унаследован CanvasModel в ImageModel было добавлено св-во: ImageModel { IBounds Bounds { get; set; } } При добавлении новой ImageModel св-ву Bounds присваивается SelectedCanvas.CanvasModel Валидация реализуется в ImageModel.
Комментариев нет:
Отправить комментарий