Как представить свойства модели представления как свойства зависимых извне? - PullRequest
3 голосов
/ 10 ноября 2011

Я пишу пользовательский элемент управления WPF, который внутренне использует MVVM. Чтобы работать «из коробки», он создает собственную модель представления (эта часть не относится к вопросу).

Мой элемент управления предоставляет ряд свойств зависимостей. Вид хоста (кто бы ни использовал мой контроль) может устанавливать эти DP или связываться с ними. Некоторые из этих DP имеют соответствующие свойства модели представления.

Это то, чего я хочу достичь (см. Диаграмму): DP в представлении моего элемента управления связаны с соответствующими свойствами view-модели. Кроме того, представление хоста должно иметь возможность устанавливать или связывать эти DP также, как вы используете любой другой элемент управления.

Однако, как только представление хоста устанавливает или связывает значение DP, первоначальная привязка (внутренняя привязка к модели представления элемента управления) теряется. Это потому, что каждый DP может иметь только один набор привязок. Так что это не работает:

Diagram of what doesn't work

Одним из решений является сделать модель представления объектом DependencyObject и его свойствами DP. Таким образом, я мог бы привязать модель представления элемента управления к его виду, а не наоборот, эффективно перевернув левую стрелку. Однако по разным причинам я хочу, чтобы моя модель представления использовала простые свойства C # и INotifyPropertyChanged.

Есть какие-нибудь идеи о том, как представить свойства модели представления как свойства зависимых извне зависимостей?

Edit:

Чтобы уточнить требования: представление фактически не создает саму модель представления (я понимаю, что это нарушило бы разделение интересов); скорее, он использует локатор модели представления для этого. (Это очень модульное корпоративное приложение.) Я знаю, что это не типичный подход (см. Ответ Рэйчел). Однако, принимая описанную установку, есть ли способ достичь желаемого результата?

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

То есть, у вас есть VM и View, они должны быть привязанными друг к другу данными, а VM не может быть DependencyObject?Ну, тройное связывание VM-V-Host невозможно, AFAIK.

Один из возможных подходов - создать дубликат набора DependencyProperties в представлении.Исходные свойства будут привязаны к ВМ и будут влиять на внешний вид View, дублированные свойства будут привязаны к Хосту и каким-то образом влияют на ВМ (например, с логикой изменения DP).

1 голос
/ 10 ноября 2011

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

Например, предположим, что я хотел PopupControl.

Я бы либо создал UserControl со всеми пользовательскими свойствами и логикой в ​​коде позади UserControl (без ViewModel)

<local:Popup Header="{Binding PopupHeader}"
             IsVisible="{Binding IsVisible}" />

ИЛИ

Я бы создал PopupViewModel и построил бы PopupUserControl, ожидая, что DataContext будет иметь тип PopupViewModel

<DataTemplate DataType="{x:Type local:PopupViewModel}">
    <local:PopupView />
</DataTemplate>

<ContentControl Content="{Binding MyPopupViewModel}" />

Свойства типа IsVisible или PopupHeader будутсуществуют в ViewModel, а не в PopupUserControl

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