Я работаю над пользовательским элементом управления диаграммой WPF. Элемент управления имеет метод, который упорядочивает элементы на диаграмме, и мне нужно добавить поддержку MVVM для вызова этого метода из моей модели просмотра. На данный момент я немного смущен, как реализовать это, и я надеюсь, что кто-то может указать мне в правильном направлении.WPF - Как запустить метод пользовательского элемента управления из модели представления?
ответ
Возможно, вам нужно переосмыслить свою концепцию. Что нужно переделать? Подумайте о 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
Спасибо за быстрый ответ на мой вопрос. Я думаю, что моя концепция была немного неправильной, поскольку ViewModel не должен ссылаться на представление.
Что бы я хотел добиться, так это то, что я могу разместить кнопку в главном окне, которая вызывает метод Arrange в пользовательском контроле.
Я понял это, добавив RoutedCommand в свой пользовательский контроль. И свойство команды кнопки в главном окне привязано к этому RoutedCommand.
Таким образом, ViewModel больше не участвует в вызове этого метода. Он просто управляет элементами, которые отображаются в пользовательском контроле.
Лучший способ реализовать такой 'ViewModel' <->' UserControl' _relationship_ - это добавить 'DependencyProperty' и привязать его к свойству из' VM'. Просьба представить образец кода/расследование того, что у вас есть. –