10

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

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

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

当我将用户控件直接放在堆栈面板下(而不是在资源中)时,它会将所选对象显示为它们的数据上下文。同理,如果我在其中放置一个 TextBox,它将显示所选项目的正确类型。

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

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

任何建议。我在想也许 StackPanel 不是正确的控件,尽管我似乎找不到其他看起来适合像这样的容器的控件。

提前致谢。

4

3 回答 3

11

将示例中的 StackPanel 替换为 ContentPresenter 而不是 DataContext 设置 Content 属性。那应该行得通。

于 2009-07-20T18:41:58.140 回答
0

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

安德鲁

于 2009-07-20T07:34:53.527 回答
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>

任何其他自定义行为,我相信您可以在此处创建或设置样式/模板。

此外,您可能会发现我的其他答案之一很有用。

祝你好运wpf,干杯。

于 2009-07-20T10:10:35.740 回答