WPF: переключение представлений с помощью DataTemplates. Как представление автоматически меняет свой DataContext?

1

Заранее спасибо за любую помощь, которую я могу получить! Я вскочу!

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

TreeView заполняется в коде MainWindow, создавая объект ObservableCollection объектов MainViewModelBase. Свойства этих объектов основаны на файле XML, который читается в начале основного кода Windows.

Это делает элементы TreeView типа MainViewModelBase. Оттуда я хочу использовать свойство "Тип" (которое было прочитано в XML) из SelectedItem Treeview чтобы отобразить UserControl в правой части экрана. На основе TON для поиска в Google, приведенный ниже код использует DataTemplates для выполнения переключателей представления.

Мой вопрос таков. Пользователь UserControl, который я хочу заполнить, должен быть привязан к другому XML файлу, а имя этого файла XML будет основано на строке с именем Name, хранящейся в MainViewModelBase. В приведенном ниже коде появилось новое представление, но я не могу понять, как установить новый DataContext Views в XML. Для контроля над содержимым должен быть какой-то способ. Я думаю, что когда вы используете DataTemplate для выполнения этого переключателя, результирующее представление наследует DataContext типа ViewModel, который "создал" его. Но я думаю, что DataContext не установлен до тех пор, пока не будет создан конструктор представления. Таким образом, у меня не может быть конструктора представления open XML, основанного на строке "имя" MainViewModel. Есть ли способ обновить DataContext после факта? Благодарю!

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

Наконец, я новичок в WPF, поэтому заранее извиняюсь, если часть моего вышеизложенного вопроса является немой или полностью запутанной. Я спрашиваю их с точки зрения кого-то нового в этой технологии.

Примечание. Я знаю, что могу привязать TreeView непосредственно к исходному XML, и я могу переключиться на это в будущем, но пока не уверен. В большинстве примеров в Интернете использовались объекты ObservableCollections для объектов VeiwModel, поэтому было легче изучить этот путь.

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>

    <DataTemplate x:Key="BlankTemplate" DataType="{x:Type ViewModel:MainViewModelBase}">
        <View:BlankControl/>
    </DataTemplate>

    <DataTemplate x:Key="ParagraphTemplate" DataType="{x:Type ViewModel:MainViewModelBase}">
        <View:ParagraphControl/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type ViewModel:MainViewModelBase}">
        <ContentControl Content="{Binding}">
            <ContentControl.Style>
                <Style TargetType="{x:Type ContentControl}">
                    <Setter Property="ContentTemplate" Value="{StaticResource BlankTemplate}" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Type}" Value="Paragraph">
                            <Setter Property="ContentTemplate" Value="{StaticResource ParagraphTemplate}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
    </DataTemplate>

</Window.Resources>

<DockPanel>

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".5*"/>
        <ColumnDefinition Width=".5*"/>
    </Grid.ColumnDefinitions>

    <TreeView Name="navigationPane" Grid.Column="0"/>

    <ContentControl Grid.Column="1" Content="{Binding ElementName=navigationPane, Path=SelectedItem}"/>

</Grid>

Теги:
xaml
wpf
datatemplate
contentcontrol

2 ответа

0
Лучший ответ

После еще нескольких Googling я нашел отличный проект по codeproject, который описывает, как использовать идею модели представления, чтобы загрузить нагрузку на treeview команды. Что мне действительно понравилось в этом, так это то, что он показал мне, как использовать материал INotifyPropertyChanged для привязки свойства isSelected к чему-то в модели представления, которая может использоваться для загрузки XML и т.д.

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

http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode

0

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

Если выше, то, что можно сделать, это привязать левый и правый боковые представления к отдельным режимам просмотра. Выбрав что-то из левой стороны, вы можете передать выбор в параметризованном конструкторе с правой стороны. Следовательно, вы будете иметь вход, выбранный на LHS, и можете выполнять обработку на RHS

  • 0
    Я думал о том же, но я не был уверен, как вы делаете конструктор в XAML (или, по крайней мере, не в коде). Я все еще изучаю MVVM. Посмотрите мой ответ на весь вопрос, я нашел отличный пример работы с древовидной структурой. Это может быть именно то, о чем вы думали. Если что, спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню