Избегайте взлома MVVM с помощью TreeView и HierarchicalDataTemplate - PullRequest
1 голос
/ 04 марта 2011

У меня есть приложение, которое я пытаюсь разработать с использованием шаблона MVVM.В моих моделях у меня есть группа и случай.Группа может содержать другие группы, а также случаи.Теперь я хочу отобразить их в виде дерева в моем представлении.Так как группы могут содержать другие группы и случаи, дерево может выглядеть примерно так: * Группа 1002 *- * Группа 1004 *---- Case ---- Case - * Группа 1010 *---- * Группа 1012 *---- Case - Case Case

У меня есть свой View, присоединенный к ViewModel, который содержит ObservableCollection of Groups.Моя проблема в том, что единственный способ заставить TreeView отображаться так, как мне хотелось бы, - это использовать HierarchicalDataTemplate в ресурсах, указывающих на тип данных (Group или Case), который, как я чувствую, нарушает MVVM (где View долженне знаю о модели).

Это работает:

 <UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type models:Group}" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding GroupName}" />
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type models:Case}">
        <TextBlock Text="{Binding CaseName}" />
    </DataTemplate>
</UserControl.Resources>

и для TreeView:

<TreeView ItemsSource="{Binding AvailableCaseGroups}" />

Это нарушает дух MVVM?Как я могу сделать это иначе?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Я не думаю, что это вообще нарушает MVVM, если View знает о ViewModel.Конечно, использование деталей модели в представлении не подходит для MVVM.Чтобы обойти это, вы можете просто построить некоторую иерархическую структуру ViewModels - MainViewModel - GroupViewModel g1 --- GroupViewModel g1a --- CaseViewModel c1b - GroupVieModel g2 ... Тогда это уже не структурная деталь вашей Модели, а одна изВаш ViewModel и может быть использован View.Если Модель может структурно измениться в будущем, превратится в плоский список или другое, ваша ViewModel может по-прежнему придерживаться старой иерархии (трансформировать модель), и ваше представление все еще действует.

0 голосов
/ 04 марта 2011

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

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

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

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