MVVM - каков идеальный путь к usercontrols, чтобы говорить друг с другом

ИДЕЯ IntelliJ 9 теперь поддержки , что они называют "супер завершением", которое соответствует поведению, которое Вы ищете и доступны через их раннюю программу доступа.

alt text
(источник: jetbrains.com )

ИДЕЯ IntelliJ 8 не позволяет Вам автоматически заполнять больше чем один параметр за один раз. Вы вынуждены использовать Управление - Сдвиг - Пространство однажды для каждого параметра.

14
задан Phil 9 April 2013 в 16:48
поделиться

9 ответов

Я думаю, что лучшим решением будет использование шаблона «Издатель / подписчик». Каждый элемент управления регистрирует некоторые события и прикрепляет удаления к событиям, предоставляемым другими элементами управления.

Чтобы раскрыть события и присоединиться к ним, вам необходимо использовать какую-то службу Mediator / EventBroker. Я нашел хороший пример здесь

1
ответ дан 1 December 2019 в 10:02
поделиться

Вы можете взаимодействовать между элементами пользовательского интерфейса, используя привязку элементов, поэтому, если пользовательский элемент управления, который вы создали, предоставляет свойство, другие пользовательские элементы управления могут быть к нему привязаны. Вы можете настроить привязку, использовать свойства зависимости вместо базовых свойств / реализовать INotifyPropertyChanged, но теоретически это возможно, но требует некоторой предусмотрительности, чтобы включить такую ​​связь.

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

0
ответ дан 1 December 2019 в 10:02
поделиться

На мой взгляд, лучший способ сделать это - использовать Commanding (Routed Commands / RelayCommand , так далее).

Я не хочу писать какой-либо код в коде xaml.

Хотя это похвальная цель,

1
ответ дан 1 December 2019 в 10:02
поделиться

Как правило, лучше всего попытаться уменьшить объем взаимодействия между частями, поскольку каждый раз, когда два пользовательских элемента управления «разговаривают» друг с другом, вы вводите между ними зависимость.

При этом следует учитывать несколько моментов:

  • UserControls всегда могут «разговаривать» с содержащимся в них элементом управления, открывая свойства и используя DataBinding. Это очень хорошо, так как он сохраняет стиль MVVM во всех аспектах.
  • Содержащий элемент управления может использовать свойства для «связывания» двух свойств двух пользовательских элементов управления вместе, опять же, с сохранением чистых границ

Если вам действительно нужно иметь Для более явного взаимодействия существует два основных подхода.

  1. Реализуйте службу, общую для обоих элементов, и используйте внедрение зависимостей, чтобы обеспечить реализацию во время выполнения. Это позволяет элементам управления взаимодействовать со службой, которая, в свою очередь, может поддерживать синхронизацию элементов управления, но также сводит зависимость к минимуму.
  2. Используйте некоторую форму обмена сообщениями для передачи сообщений между элементами управления. Многие инфраструктуры MVVM используют этот подход, поскольку он отделяет отправку сообщения от получения сообщения, опять же, сводя зависимости к минимуму.
14
ответ дан 1 December 2019 в 10:02
поделиться

Вы можете совместно использовать некоторые объекты модели представления между элементами управления, а также команды ...

Например, у вас есть некий главный элемент управления, который содержит два других элемента управления. И у вас есть некоторые функции фильтрации в главном элементе управления, но вы хотите разрешить пользователю устанавливать некоторую часть фильтра в первом подчиненном элементе управления (например, «Полный фильтр») и некоторую часть фильтра в другом (например, «Быстрый фильтр» "). Также вы хотите иметь возможность начать фильтрацию из любого подэлемента управления. Затем вы можете использовать такой код:

public class MainControlViewModel : ObservableObject
{
    public FirstControlViewModel firstControlViewModel;
    public SecondControlViewModel firstControlViewModel;

    public ICommand FilterCommand;
    public FilterSettings FilterSettings;

    public MainControlViewModel()
    {
        //...

        this.firstControlViewModel = new FirstControlViewModel(this.FilterSettings, this.FilterCommand);
        this.secondControlViewModel = new SecondControlViewModel(this.FilterSettings, this.FilterCommand);
    }
}

public class FirstControlViewModel : ObservableObject
{
    //...
}

public class SecondControlViewModel : ObservableObject
{
    //...
}

В главном элементе управления XAML вы привяжете субэлементы управления DataContext к соответствующим моделям представления. Каждый раз, когда субэлемент управления изменяет настройку фильтра или выполняет команду, другой субэлемент управления получает уведомление.

0
ответ дан 1 December 2019 в 10:02
поделиться

Как уже говорили другие, у вас есть несколько вариантов.

Предоставление DepedencyProperties для ваших пользовательских элементов управления и привязка к этим свойствам в большинстве случаев обеспечивает чистое решение XAML, но может вводить некоторые зависимости пользовательского интерфейса в порядок, чтобы привязки видели друг друга

Другой вариант - это разделенный шаблон обмена сообщениями для отправки сообщений между ViewModels. Я бы хотел, чтобы ваши пользовательские элементы управления были привязаны к свойствам на их собственной виртуальной машине, а затем при изменении свойства внутри этой виртуальной машины он может «опубликовать» сообщение, которое уведомляет других «подписчиков» о том, что что-то произошло, и они могут реагировать на это сообщение, как бы они ни хотели .

У меня есть сообщение в блоге по этой теме, если это поможет: http://www.bradcunningham.net/2009/11/decoupled-viewmodel-messaging-part-1. html

0
ответ дан 1 December 2019 в 10:02
поделиться

Для этого существует множество различных механизмов, но сначала вы должны выяснить, к какому уровню вашей архитектуры принадлежит эта коммуникация.

Одна из целей инфраструктуры MVVM состоит в том, что разные представления могут над той же моделью просмотра. Будут ли эти пользовательские элементы управления взаимодействовать друг с другом только в том представлении, которое вы в настоящее время реализуете, или им придется взаимодействовать друг с другом в других возможных представлениях? В последнем случае вы хотите реализовать его ниже уровня представления, либо в модели представления, либо в самой модели.

Пример первого случая может быть, если ваше приложение выполняется на очень маленькой поверхности дисплея. Возможно, вашим пользовательским элементам управления придется конкурировать за визуальное пространство. Если пользователь щелкает один элемент управления, чтобы развернуть его, остальные должны свернуть. Это не имело бы ничего общего с моделью просмотра, это ' это просто адаптация к технологии.

Или, может быть, у вас есть разные модели просмотра с разными пользовательскими элементами управления, где все может происходить без изменения модели. Примером этого может быть навигация. У вас есть список чего-либо и панель сведений с полями и командными кнопками, которые связаны с выбранным элементом в списке. Вы можете захотеть провести модульное тестирование логики того, какие кнопки включены для каких элементов. Модель не имеет отношения к тому, на какой элемент вы смотрите, только когда нажимаются команды кнопок или изменяются поля.

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

Или, может быть, у вас разные модели просмотра с разными пользовательскими элементами управления, где все может происходить без изменения модели. Примером этого может быть навигация. У вас есть список чего-либо и панель сведений с полями и командными кнопками, которые связаны с выбранным элементом в списке. Вы можете захотеть провести модульное тестирование логики того, какие кнопки включены для каких элементов. Модель не имеет отношения к тому, на какой элемент вы смотрите, только когда нажимаются команды кнопок или изменяются поля.

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

Или, может быть, у вас разные модели просмотра с разными пользовательскими элементами управления, где все может происходить без изменения модели. Примером этого может быть навигация. У вас есть список чего-либо и панель сведений с полями и командными кнопками, которые связаны с выбранным элементом в списке. Вы можете захотеть провести модульное тестирование логики того, какие кнопки включены для каких элементов. Модель не имеет отношения к тому, на какой элемент вы смотрите, только когда нажимаются команды кнопок или изменяются поля.

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные модели представления, которые действуют, должны измениться из-за ряби изменений в модели.

Итак, резюмируя: «Это зависит от…»

где все может происходить без изменения модели. Примером этого может быть навигация. У вас есть список чего-либо и панель сведений с полями и командными кнопками, которые связаны с выбранным элементом в списке. Вы можете захотеть провести модульное тестирование логики того, какие кнопки включены для каких элементов. Модель не имеет отношения к тому, на какой элемент вы смотрите, только когда нажимаются команды кнопок или изменяются поля.

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные модели представления, которые действуют, должны измениться из-за ряби изменений в модели.

Итак, резюмируя: «Это зависит от…»

где все может происходить без изменения модели. Примером этого может быть навигация. У вас есть список чего-либо и панель сведений с полями и командными кнопками, которые связаны с выбранным элементом в списке. Вы можете захотеть провести модульное тестирование логики того, какие кнопки включены для каких элементов. Модель не имеет отношения к тому, на какой элемент вы смотрите, только когда нажимаются команды кнопок или изменяются поля.

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Затем различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

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

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

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

Потребность в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Затем различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

Мы рассматриваем только тогда, когда нажимаются команды кнопок или изменяются поля.

Необходимость такого взаимодействия может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные действующие модели представления должны измениться из-за колебаний в модели.

Итак, резюмируя: «Это зависит от…»

Мы рассматриваем только тогда, когда нажимаются команды кнопок или изменяются поля.

Необходимость в этом взаимодействии может быть даже в самой модели. Возможно, у вас есть денормализованные данные, которые обновляются из-за изменения других данных. Тогда различные модели представления, которые действуют, должны измениться из-за ряби изменений в модели.

Итак, резюмируя: «Это зависит от…»

3
ответ дан 1 December 2019 в 10:02
поделиться

Если вы используете строгий MVVM, то пользовательский элемент управления является представлением и должен только «взаимодействовать», или, скорее, привязать к его ViewModel. Поскольку ваши ViewModels, скорее всего, уже реализуют INotifyPropertyChanged, если у них есть ссылка друг на друга, они могут использовать события PropertyChanged, чтобы получать уведомления при изменении свойств, или они могут вызывать методы (лучше, если это через интерфейс) для связи с каждым прочее.

0
ответ дан 1 December 2019 в 10:02
поделиться

Ваша концептуальная проблема здесь:

Каждому пользовательскому элементу управления соответствует соответствующая виртуальная машина.

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

ViewModel отражает концепцию «текущего состояния пользовательского интерфейса» - например, на какой странице вы находитесь и редактируете ли вы - в отличие от «текущих значений данных».

Чтобы действительно воспользоваться преимуществами MV-VM, определите количество используемых классов ViewModel на основе отдельных элементов, которым необходимо состояние. Например, если у вас есть список элементов, каждый из которых может отображаться в трех состояниях, вам понадобится одна виртуальная машина на элемент. у вас есть три представления, все из которых отображают данные тремя разными способами в зависимости от общей настройки, общая настройка должна быть сохранена в одной виртуальной машине.

После того, как вы структурируете свои модели просмотра, чтобы отразить требования поставленной задачи, вы обычно обнаружили, что нет необходимости или желания передавать состояние между представлениями.Если есть такая необходимость, лучше всего повторно оценить дизайн модели ViewModel, чтобы увидеть, может ли общая ViewModel выиграть от небольшого количества дополнительной информации о состоянии.

Будут времена, когда сложность Приложение диктует использование нескольких ViewModels для одного и того же объекта модели. В этом случае ViewModels может сохранять ссылки на общий объект состояния.

8
ответ дан 1 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: