WPF-使用DataTemplates将数据绑定到StackPanel

WPF-使用DataTemplates将数据绑定到StackPanel,wpf,data-binding,datatemplate,Wpf,Data Binding,Datatemplate,我修改了我的问题,因为它在尝试时改变了焦点。 我把问题缩小到以下几点 我尝试将TreeView的选定项绑定到StackPanel(或可以容纳用户控件的其他容器)。然后,此容器将根据所选项目的类型显示UserControl <TextBox Name="textBox1" Text="{Binding}" /> 这是StackPanel的xaml(treeview和StackPanel都在同一个窗口==>不同的网格列) 当我将一个用户控件直接放在stackpanel下面(不在参考

我修改了我的问题,因为它在尝试时改变了焦点。 我把问题缩小到以下几点

我尝试将TreeView的选定项绑定到StackPanel(或可以容纳用户控件的其他容器)。然后,此容器将根据所选项目的类型显示UserControl

<TextBox Name="textBox1" Text="{Binding}" />
这是StackPanel的xaml(treeview和StackPanel都在同一个窗口==>不同的网格列)


当我将一个用户控件直接放在stackpanel下面(不在参考资料中)时,它会显示它,并将所选对象作为其datacontext。 Idem如果我在其中放置一个文本框,它将显示所选项目的正确类型

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

出于某种原因,将其放置在数据模板中(即使没有设置数据类型)也不会显示任何内容

任何建议。我想StackPanel可能不是这个的合适控件,尽管我似乎找不到其他像这样的容器一样合适的控件


提前感谢。

尽管您已经在第二个自定义控件上设置了绑定,但是您是否正在设置DataContext,因为绑定是到信息的路由,DataContext是它应用此绑定信息的信息


Andrew

您可以创建一个用户控件,将树状视图和右侧的选择信息显示在一起。它使您不必创建任何自定义控件。自定义控件基本上是不必要的,因为您不创建以前不存在的任何东西

<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好运,干杯。

将示例中的StackPanel替换为ContentPresenter,而不是DataContext设置Content属性。应该可以。

是的,在自定义控件中设置了datacontext,如下所示。。。(当然非常简化)ModelObject c=repo.GetByID(3295123);ViewModelTree vmt=新的ViewModelTree(c);base.DataContext=vmt;可能是因为我只绑定到用户控件的DataContext,而不是窗口,因此窗口中的其他控件看不到我吗?谢谢。这正是我现在一直试图实现的,只是直接在窗口xaml中实现(而不是用户控件)。虽然stackpanel中的detail(user)控件的选择不起作用,但TextBlock确实显示所选treeview项的类型。完全正确!DataContext没有任何意义,它只是用于绑定。内容属性是用来展示东西的。非常感谢。它工作得很好。关于为什么它不能使用StackPanel的任何输入?正如Oleg所说,DataContext本身并不意味着什么,它只是下面的任何绑定可以工作的地方。将其视为设置要查看的堆栈帧或变量范围。您需要的是实际创建一个绑定,并对其进行评估和显示,这就是ContentPresenter(用于单个项目)或ItemsPresenter(用于集合)的目的。尝试查找ContentPresenter和DataTemplates,看看它们实际上是如何交互的。我不知道有什么好的博客文章,但可能有一些。