none
MVVM разделение View RRS feed

  • Вопрос

  • Есть MainView, в котором лежит TreeView, который будет отображать коллекцию Bridges, а в каждом Bridge есть коллекция Controllers. Для каждого элемента будет определен свой способ отображения. 

    Задача: как разделить View на 3 части MainView, BridgeView и ControllerView?

    <TreeView ItemsSource="{Binding Bridges}">
       <TreeView.ItemTemplate>
          <v:BridgeView/>
       </TreeView.ItemTemplate>
    </TreeView>
    Такой вариант реализовать не получилось... Причем для BridgeView нужно задать BridgeViewModel, который я передавал в конструктор.

    Для того, чтобы было понятнее о чем речь хочу получить что-то вроде такой структуры:

            <ScrollViewer>
                <TreeView>
                    <TreeViewItem>
                        <TreeViewItem.Header>
                            <Border>
                                <!--binding, commands...-->
                                <TextBlock Text="BridgeView" />
                            </Border>
                        </TreeViewItem.Header>
                        <TreeViewItem>
                            <TreeViewItem.Header>
                                <Border>
                                    <!--binding, commands...-->
                                    <TextBlock Text="ControllerView" />
                                </Border>
                            </TreeViewItem.Header>
                        </TreeViewItem>
                        <TreeViewItem>
                            <TreeViewItem.Header>
                                <Border>
                                    <!--binding, commands...-->
                                    <TextBlock Text="ControllerView" />
                                </Border>
                            </TreeViewItem.Header>
                        </TreeViewItem>
                    </TreeViewItem>
                </TreeView>
            </ScrollViewer>
    Для решения этой задачи лучше использовать DataTemplate или есть другие способы?

    10 июля 2013 г. 10:16

Ответы

  • Да, что то был невнимателен. Да, можно обойтись без селектора. Можно не в ресурсах, можно прямо в TreeView:

    <TreeView>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ControllerViews}">
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate>
                        <Border>
                            <!--binding, commands...-->
                            <TextBlock Text="ControllerView" />
                        </Border>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
                <Border>
                    <!--binding, commands...-->
                    <TextBlock Text="BridgeView" />
                </Border>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    Или можно сделать UserControl и вставить их вместо Border-ов.
    • Помечено в качестве ответа alekseydav 10 июля 2013 г. 11:49
    10 июля 2013 г. 11:23
    Отвечающий

Все ответы

  • Добрый день.

    Если коротко, то да. Я бы сделал два DataTemplate, а в дереве применил бы ItemTemplateSelector.

    10 июля 2013 г. 11:02
    Отвечающий
  • ItemTemplateSelector тут явно не нужен. Нет необходимости выбирать DataTemplate в зависимости от данных. Корневой элемент TreeView - это всегда BridgeView, а дочерний ControllerView.

    DataTemplate необходимо определять в ресурсах? Может быть есть другой способ?

    10 июля 2013 г. 11:16
  • Да, что то был невнимателен. Да, можно обойтись без селектора. Можно не в ресурсах, можно прямо в TreeView:

    <TreeView>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ControllerViews}">
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate>
                        <Border>
                            <!--binding, commands...-->
                            <TextBlock Text="ControllerView" />
                        </Border>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
                <Border>
                    <!--binding, commands...-->
                    <TextBlock Text="BridgeView" />
                </Border>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    Или можно сделать UserControl и вставить их вместо Border-ов.
    • Помечено в качестве ответа alekseydav 10 июля 2013 г. 11:49
    10 июля 2013 г. 11:23
    Отвечающий