首页 文章

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

提问于
浏览
10

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

我尝试将TreeView的选定项绑定到StackPanel(或其他一些可以容纳用户控件的容器) . 然后,此容器将显示UserControl,具体取决于所选项目的类型 .

这是StackPanel的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>

当我将用户控件直接放在stackpanel下(而不是在资源中)时,它会将所选对象显示为datacontext . 同上,如果我在其中放置一个TextBox,它将显示所选项目的正确类型 .

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

出于某种原因,将其放在DataTemplate中(即使不设置DataType)也不会显示任何内容 .

任何sugestions . 我想也许StackPanel可能不适合这个,虽然我似乎找不到其他适合像这样的容器的控件 .

提前致谢 .

3 回答

  • 0

    使用ContentPresenter替换示例中的StackPanel,而不是DataContext设置Content属性 . 这应该工作 .

  • 11

    虽然您已在第二个自定义控件上设置了Binding,但是您是否设置了DataContext,因为绑定是信息的路径,而DataContext是它将此绑定信息应用到的信息 .

    安德鲁

  • 0

    您可以创建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>
    

    任何其他自定义行为,我相信你可以在这里创建或设置样式/模板 .

    此外,您可能会发现我的其他answer之一很有用 .

    祝wpf好运,欢呼 .

相关问题