2016-01-24 6 views
0

Мне было предложено разработать диалоговое окно в WPF, которое содержит элемент управления картой (OnlineMapControl). Управление картой & связанная бизнес-логика находится в коде позади. Я создал свой контроль как окно, а также написал простую модель представления.Код за управлением с шаблоном MVVM?

Родительский вид, который запускает диалог, находится в командной строке в виде модели. Я знаю, что в идеале мы должны использовать в IDialogService или эквивалент, однако старшие посоветовали мне пойти с .showdialog() в методе командного вида модели а-ля:

Public ShowChildDialogCommandAction() 
{ 
    DialogViewModel dialogViewModel = NewDialogViewModel(); 
    DialogView dialogview = new DialogView(dialogViewModel); 

    dialogView.ShowDialog(); 
} 

Это работает отлично, тесная связь в стороне. Проблемы возникают, когда я пытаюсь получить доступ к свойствам в коде дочернего представления, находящимся под управлением карты. Экземпляр dialogViewModel ничего не знает о модуле OnlineMapControl, поэтому я пытаюсь преследовать значение свойства через все эти классы с именами дублированных свойств &, попадая в логические спагетти в коде DialogView позади с this.onlineMapControl.zoomLevel = this.dialogViewModel.zoomLevel и т. Д. Который имеет очень плохой запах кода. Как вы справляетесь с дизайном, близким к этому, потому что сложный элемент управления в представлении доступен только через код за & сохранить шаблон MVVM неповрежденным?

+0

Трудно прокомментировать без кода, который точно показывает, в чем проблема. Похоже, что ваш контроль над картой должен раскрывать различные свойства зависимостей для таких вещей, как «ZoomLevel», а затем вы просто привязываете их к вашему «DialogViewModel» в «DialogView». –

+0

mvvm! = No codebehind. Логика пользовательского интерфейса должна идти в вашем пользовательском интерфейсе. – Will

ответ

0

Если вы делаете правильную MVVM, то ваша модель представления должна быть вида по DataContext:

DialogViewModel dialogViewModel = NewDialogViewModel(); 
DialogView dialogview = new DialogView{DataContext = dialogViewModel}; 

С этого момента на DialogView XAML следует использовать привязку данных и не должны иметь какой-либо код-за собой , поэтому копирование любых данных между ним и DialogViewModel становится спорным.

Кстати, услуга - это не единственный способ реализовать диалоговые окна, ее довольно легко реализовать, используя обычную привязку данных, как я показал в an article I wrote last year.

Смежные вопросы