Ответ 1
Замените StackPanel в вашем примере на ContentPresenter, а вместо DataContext установите свойство Content. Это должно работать.
Я изменил свой вопрос, так как он изменил фокус при попытке разобраться. Я сузил проблему до следующего...
Я пытаюсь привязать выбранный элемент TreeView к StackPanel (или к другому контейнеру, который может содержать пользовательские элементы управления). Затем этот контейнер отобразит UserControl, в зависимости от типа выбранного элемента.
Вот xaml StackPanel (как treeview, так и stackpanel находятся в одном и том же окне == > другой столбец сетки)
<StackPanel Grid.Column="2" MinWidth="500" DataContext="{Binding ElementName=myTree, Path=SelectedItem, Mode=OneWay}">
<StackPanel.Resources>
<DataTemplate DataType="{x:Type mvTypes:MyTypeA}">
<controls:UserControlA DataContext="{Binding}" />
</DataTemplate>
<DataTemplate DataType="{x:Type mvTypes:MyTypeB}">
<controls:UserControlB DataContext="{Binding}" />
</DataTemplate>
</StackPanel.Resources>
</StackPanel>
Когда я помещаю пользовательский элемент управления непосредственно под панелью стека (а не в ресурсы), он отображает его с выбранным объектом в качестве своего datacontext. Если я помещаю в него TextBox, он отобразит правильный тип выбранного элемента.
<TextBox Name="textBox1" Text="{Binding}" />
По какой-то причине размещение его в DataTemplate (даже без установки DataType) приводит к тому, что ничего не отображается.
Любые предложения. Я думаю, что, возможно, StackPanel не подходит для этого, хотя я не могу найти другие элементы управления, которые выглядят подходящими в качестве таких контейнеров.
Спасибо заранее.
Замените StackPanel в вашем примере на ContentPresenter, а вместо DataContext установите свойство Content. Это должно работать.
Хотя вы установили привязку во втором настраиваемом элементе управления, вы устанавливаете DataContext, поскольку привязка является маршрутом к информации, а DataContext - информацией, к которой она применяет эту информацию привязки.
Эндрю
Вы можете создать UserControl для отображения TreeView и информации о выборе справа, все в одном. Это избавляет вас от создания какого-либо настраиваемого элемента управления. Пользовательский элемент управления в основном не нужен, поскольку вы не создаете ничего, чего раньше не было.
<UserControl x:Class="NameSpace.SelectionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="namespace.Controls"
Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TreeView Name="customTree">
<!--Items go here-->
</TreeView>
<StackPanel Grid.Column="1" MinWidth="50" DataContext="{Binding ElementName=customTree, Path=SelectedItem, Mode=OneWay}">
<StackPanel.Resources>
<DataTemplate DataType="{x:Type StylingTest:CustomViewModelA}">
<controls:CustomADetailsControl />
</DataTemplate>
<DataTemplate DataType="{x:Type StylingTest:CustomViewModelB}">
<controls:CustomBDetailsControl />
</DataTemplate>
</StackPanel.Resources>
<TextBlock Text="{Binding}"/>
</StackPanel>
</Grid>
</UserControl>
Любое другое пользовательское поведение, я уверен, что вы можете создавать или устанавливать в стилях/шаблонах здесь.
Кроме того, вы можете найти один из моих полезных ответов .
Удачи вам в wpf, приветствиях.