Отображение пользовательских элементов управления на основе типа, к которому привязан выбор TreeView - PullRequest
9 голосов
/ 08 апреля 2010

Я делаю приложение в WPF в стиле, похожем на Windows Explorer, с TreeView слева и панелью справа.

Я хочу, чтобы содержимое правой панели менялось в зависимости отТип выбранного элемента в TreeView.

Например, скажем, верхний уровень в древовидном представлении содержит объекты класса «A», а если развернуть объект «A», вы увидите список объектов «B» как потомков объекта «A».«Объект».

Если выбран объект «A», я хочу, чтобы на правой панели отображался пользовательский элемент управления для «A», а если выбран «B», я хочу, чтобы на правой панели отображался пользовательский элемент управления для «B».".

В настоящее время у меня есть эта работа:

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

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

Ответы [ 2 ]

10 голосов
/ 08 апреля 2010

Рассматривали ли вы отображение ContentControl в качестве правой панели и использование DataTemplates для настройки содержимого? Затем вы можете просто привязать правую панель к выбранному элементу TreeView.

Например:

<ContentControl Content="{Binding SelectedItem,ElementName=treeView1}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type my:A}">
            <StackPanel>
                <TextBlock Text="Displaying an A!" />
                <TextBlock Text="{Binding Foo}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate DataType="{x:Type my:B}">
            <StackPanel>
                <TextBlock Text="Displaying a B!" />
                <TextBlock Text="{Binding Bar}" />
            </StackPanel>
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>
6 голосов
/ 08 апреля 2010

Вы можете использовать класс ContentPresenter с DataTemplateSelector. Свяжите свойство Content со свойством TreeView.SelectedItem, затем используйте DataTemplateSelector для условного выбора шаблона.

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