Как динамически внедрить пользовательский элемент управления на основе выбора пользователя - PullRequest
4 голосов
/ 27 мая 2011

У меня есть элемент управления TreeView в моем окне, который в зависимости от того, какой выбор пользователь выбрал, должен отображать пользовательский элемент управления (выяснение, какой пользовательский элемент управления для отображения завершен). У меня проблемы с выяснением, как на самом деле отображать пользовательский элемент управления. По сути, пользователь выбирает элемент из TreeView, и в зависимости от выбора появится пользовательский элемент управления (в элементе управления ContentControl, который я предполагаю).

В настоящее время для открытия новых окон у меня есть оконный адаптер, где я могу на лету создавать новые окна и устанавливать родителя.

Как я могу сделать это в моей модели представления?

Редактировать

Вот то, о чем я полагаю, Рэйчел говорила, когда упоминала, что вместо нее использовали DataTemplate. Не беспокойтесь о моем DataTemplates вместо атрибута DataType. Это просто название моего проекта.

<Window.Resources>
    <DataTemplate DataType="{x:Type DataTemplates:FooEditorViewModel}">
        <DataTemplates:FooControl></DataTemplates:FooControl>
    </DataTemplate>
    <DataTemplate DataType="{x:Type DataTemplates:BarEditorViewModel}">
        <DataTemplates:BarControl></DataTemplates:BarControl>
    </DataTemplate>
</Window.Resources>

А вот пример модели вида.

public class ViewModel
{
    public IEditorViewModel Editor
    {
        get
        {
            return new BarEditorViewModel();
        }
    }
}

И склеить все это вместе с

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

Мне пришлось создать пустой интерфейс с именем IEditorViewModel, чтобы вернуть разные пользовательские редакторы управления. Не уверен, есть ли способ обойти это.

Надеется, это кому-нибудь поможет.

1 Ответ

5 голосов
/ 27 мая 2011

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

Примером может быть что-то вроде:

<ContentControl Content="{Binding SelectedItem}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedItem}" Value="{x:Type local:ItemA}">
                    <Setter Property="ContentTemplate" Value="{StaticResource TemplateA}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SelectedItem}" Value="{x:Type local:ItemB}">
                    <Setter Property="ContentTemplate" Value="{StaticResource TemplateB}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

Лучшая альтернативаэто использовать DataTemplates для разных предметов.Затем вы просто устанавливаете Content="{Binding SelectedItem}", и WPF разрешает использовать правильный DataTemplate.Я только что показал приведенный выше пример первым, потому что он может быть использован для создания вашего шаблона из свойства SelectedItem

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