Я изменил свой вопрос, так как он изменил фокус при попытке разобраться. Я сузил проблему до следующего ...WPF - Databind to StackPanel с использованием DataTemplates
Я пытаюсь привязать выбранный элемент 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>
Когда я помещаю пользовательский элемент управления непосредственно под StackPanel (не в ресурсах), он отображает его с выбранным объектом в качестве своего datacontext. Если я помещаю в него текстовое поле, он отображает правильный тип выбранного элемента.
<TextBox Name="textBox1" Text="{Binding}" />
По какой-то причине, поместив его в DataTemplate (даже без установки DATATYPE) результатов ни в чем, чтобы отобразить.
Любые санкции. Я думаю, что, возможно, StackPanel не подходит для этого, хотя я не могу найти другие элементы управления, которые выглядят подходящими как контейнеры, подобные этому.
Заранее благодарен.
Точно! DataContext ничего не значит, это просто для привязки. Свойство контента - вот что для представления вещей. –
Большое вам спасибо. Он отлично работает. Любой вклад в почему он не работал с помощью StackPanel? – Ronald
Как сказал Олег, DataContext ничего не значит сам по себе, именно там будут работать какие-либо привязки ниже этого. Подумайте об этом, например, о том, как установить фрейм стека или область видимости переменной. Вам нужно было создать привязку и оценить ее и отобразить, что означает ContentPresenter (для отдельного элемента) или ItemsPresenter (для коллекции). сделано для. Попробуйте найти ContentPresenters и DataTemplates и посмотреть, как они на самом деле взаимодействуют. Я не знаю никаких хороших сообщений в блоге, но, вероятно, есть некоторые из них. –