Как определить usercontrols в шаблоне mvvm? - PullRequest
1 голос
/ 03 марта 2012

Я использовал от mvvm в моем приложении. Я хочу знать, как определить мой пользовательский элемент управления в шаблоне mvvm.

Должен ли я определить это с помощью mvvm, или я могу определить это вообще?

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Давайте просто вызовем элемент управления, который встраивает пользовательский элемент управления MainWindow и пользовательский элемент управления UserControl. Поскольку вы находитесь в шаблоне MVVM, у вас есть по крайней мере одна модель представления для внешнего представления - я обычно использую имя MainVm. У вас есть два варианта для пользовательского элемента управления: они могут использовать одну и ту же модель представления, или у вас может быть модель вспомогательного представления, только для UserControl, т.е.

Для вашего первого выбора вы ничего не делаете. Вы определяете UserControl (Visual Studio «Добавить новый элемент» -> «Управление пользователем» - довольно хорошее начало). Затем вы просто встраиваете его в главное окно.

<Window
    x:Class="SO.MainWindow"
    ...
    xmlns:src="clr-namespace:SO"
    ...
    >
    ...
    <src:UserControl />
    ...
</Window>

UserControl унаследует тот же DataContext от MainWindow и выполнит все {Binding}, как вы бы сделали в MainWindow.

Если вы хотите иметь модель подчиненного представления (UserVm) - это обычно будет публичное свойство MainVm (скажем, userVm). В этом случае вы будете устанавливать DataContext из UserControl при обращении к нему.

<src:UserControl DataContext="{Binding Path=userVm}" />

Другой популярной парадигмой было бы объявление DataTemplate вместо UserControl. Если вы сделаете это, вам просто нужно поместить UserVm (либо создать его экземпляр в XAML, либо с помощью привязки):

<Window x:Class="MainWindow" ...>
    <Window.Resources>
        <DataTemplate x:Key="UserDt">   <!-- or user TargetType instead of x:Key -->
            ...
        </DataTemplate>
    </Window.Resources>

    ...

    <!-- You can put in a ContentControl like here: -->
    <ContentControl Content="{Binding Path=userVm}" 
                    ContentTemplate="{StaticResource UserDt}" />

    <!-- or, if you defined TargetType for the DT, you can simply instantiate
         the sub VM here. I don't like this apporach but it exists. -->
    <src:UserVm />
</Window>
2 голосов
/ 03 марта 2012

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

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

Я подозреваю, что вы получите лучшее повторное использование и модульность со вторым подходом.

Короче: это зависит.

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