2015-10-12 2 views
0

Я работаю над пользовательским элементом управления диаграммой WPF. Элемент управления имеет метод, который упорядочивает элементы на диаграмме, и мне нужно добавить поддержку MVVM для вызова этого метода из моей модели просмотра. На данный момент я немного смущен, как реализовать это, и я надеюсь, что кто-то может указать мне в правильном направлении.WPF - Как запустить метод пользовательского элемента управления из модели представления?

+0

Лучший способ реализовать такой 'ViewModel' <->' UserControl' _relationship_ - это добавить 'DependencyProperty' и привязать его к свойству из' VM'. Просьба представить образец кода/расследование того, что у вас есть. –

ответ

0

Возможно, вам нужно переосмыслить свою концепцию. Что нужно переделать? Подумайте о ViewModel логике представления, и представление должно быть как дамп максимально возможным без какой-либо логики. Я также предполагаю, что метод «устраивает» должен быть хорошо протестирован, и это также может быть «проще» сделано на ViewModel (если сделано правильно). Лучше всего поставить логику в ViewModel.

С головы до ног я мог думать о DiagramViewModel с ObservableCollection<ShapeViewModel>. ShapeViewModel может быть либо базовым классом, либо конкретным классом, который также может иметь некоторую информацию о местоположении формы и т. Д. Связь между моделями просмотра может быть выполнена через Messenger (MVVM Light Messenger) или EventAggregator https://msdn.microsoft.com/en-us/library/ff921122.aspx.

Если вы все еще хотите оставить свою архитектуру по своему усмотрению и хотите выполнить метод в представлении, я бы отвлек ее в службе. IDiagramUpdateService. Посмотрите на следующую статью, которая дает вам хорошее представление о связи между видами и видами просмотра (и наоборот). https://msdn.microsoft.com/en-us/magazine/jj694937.aspx Вы найдете отличную информацию для обоих подходов. HTH

0

Спасибо за быстрый ответ на мой вопрос. Я думаю, что моя концепция была немного неправильной, поскольку ViewModel не должен ссылаться на представление.

Что бы я хотел добиться, так это то, что я могу разместить кнопку в главном окне, которая вызывает метод Arrange в пользовательском контроле.

Я понял это, добавив RoutedCommand в свой пользовательский контроль. И свойство команды кнопки в главном окне привязано к этому RoutedCommand.

Таким образом, ViewModel больше не участвует в вызове этого метода. Он просто управляет элементами, которые отображаются в пользовательском контроле.