Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Валидация свойств модели в SelectedModel

#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.

Комментариев нет:

Отправить комментарий