Заранее спасибо за любую помощь, которую я могу получить! Я вскочу!
Предположим, у меня есть следующий 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>
После еще нескольких Googling я нашел отличный проект по codeproject, который описывает, как использовать идею модели представления, чтобы загрузить нагрузку на treeview команды. Что мне действительно понравилось в этом, так это то, что он показал мне, как использовать материал INotifyPropertyChanged для привязки свойства isSelected к чему-то в модели представления, которая может использоваться для загрузки XML и т.д.
Я знаю, что это может показаться основным для вас гуру WPF, но это было так полезно объяснить мне, как реально использовать шаблон ViewModel.
http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode
После прочтения вашего сообщения, если я не ошибаюсь, у вас в основном есть древовидная структура с левой стороны и на основе выбора вы хотите заполнить некоторый пользовательский элемент управления с правой стороны. Это суть требования.
Если выше, то, что можно сделать, это привязать левый и правый боковые представления к отдельным режимам просмотра. Выбрав что-то из левой стороны, вы можете передать выбор в параметризованном конструкторе с правой стороны. Следовательно, вы будете иметь вход, выбранный на LHS, и можете выполнять обработку на RHS