WPF - привязка данных к StackPanel с использованием шаблонов данных - PullRequest
10 голосов
/ 20 июля 2009

Я изменил свой вопрос, так как он изменил фокус при попытке что-то сделать. Я сузил проблему до следующего ...

Я пытаюсь привязать выбранный элемент TreeView к StackPanel (или некоторому другому контейнеру, который может содержать пользовательские элементы управления). Этот контейнер будет отображать UserControl, в зависимости от типа выбранного элемента.

Вот xaml 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>

Когда я размещаю пользовательский элемент управления непосредственно под панелью стека (не в ресурсах), он отображает его с выбранным объектом в качестве своего текста данных. Предположим, если я поместу в него TextBox, он покажет правильный тип выбранного элемента.

<TextBox Name="textBox1" Text="{Binding}" />

По какой-то причине размещение его в DataTemplate (даже без установки DataType) не приводит к отображению.

Любые предложения. Я думаю, что, возможно, StackPanel не подходит для этого, хотя я не могу найти другие элементы управления, которые выглядят как контейнеры.

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 20 июля 2009

Замените StackPanel в вашем примере на ContentPresenter и вместо DataContext установите свойство Content. Это должно работать.

0 голосов
/ 20 июля 2009

Вы можете создать 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>

Любое другое пользовательское поведение, я уверен, что вы можете создать или установить его в стилях / шаблонах здесь.

Также вам может пригодиться один из моих ответов s.

Удачи с wpf, ура.

0 голосов
/ 20 июля 2009

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

Andrew

...