работа с WPF usercontrol и MVVM - PullRequest
4 голосов
/ 02 июня 2010

У меня есть следующие вопросы

  1. Если потребитель моего usercontrol назначит DataContext usercontrol или установит какое-либо свойство зависимости. (относится к # 3: если DataContext, то мои отдельные элементы должны быть привязаны напрямую к объекту, указанному в DC, если DP, то я могу позволить себе связываться с любой виртуальной машиной)
  2. Если они устанавливают свойство, и если я использую 3 примитивных элемента, я должен принять их как отдельные свойства или объединить их вместе в Модель для моего usercontrol
  3. Должен ли я попросить потребителя моего пользовательского элемента управления отправить мне модель или модель представления (я говорю viewmodel, но для всех элементов управления, которые я использовал до сих пор, я никогда не видел, чтобы кто-нибудь просил меня отправить им ВМ - я уверен, что некоторые внутренняя реализация MVVM

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

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

1) Потребитель должен установить свойства зависимости, которые определены в пользовательском элементе управления. Используя datacontext, вы будете связывать пользовательский контроль с потребителем.

2) Воспринимайте их как отдельные примитивные свойства, в противном случае потребителю потребуется излишне создать объект, чтобы удовлетворить вашу модель (опять соединение: зачем потребителю знать о вашей модели?).

3) Нет, вам не следует просить клиента присылать вам модель представления. Зачем вам нужно знать, какой потребитель использует ваш «общий» пользовательский элемент управления.

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

0 голосов
/ 15 февраля 2012

1. Я бы сказал, что это зависит от типа UserControl, если он «универсальный», вы должны иметь возможность изменять DataContext, поскольку внутренний элемент управления не должен иметь ничего общего с DataContext. Например, если я создаю ImageButton UserControl, который предоставляет свойства Caption и ImageSource, то они должны быть связаны внутренне независимо от DataContext, в этом случае они могут быть связаны, а также может быть изменен DataContext, например

<uc:ImageButton Caption="{Binding ButtonInfo.Caption}"
                ImageSource="{Binding ButtonInfo.Image}"/>

Здесь можно изменить DataContext, чтобы немного упростить привязки:

<uc:ImageButton DataContext="{Binding ButtonInfo}"
                Caption="{Binding Caption}"
                ImageSource="{Binding Image}"/>

Если, с другой стороны, UserControl является представлением для модели представления, я бы ожидал, что UserControl будет привязывать к свойствам представления внутренне, относительно DataContext.

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

<v:StatisticsView />

Если передаваемая модель просмотра находится в свойстве текущего DataContext, вы можете также связать DataContext:

<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/>

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


3. Как отмечено в 1. Это должно быть видно из самого UserControl, если это StatisticsView, то потребитель должен передать StatisticsViewModel (либо неявно, наследуя текущий DataContext, либо явно связав его).

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