TreeView的Object绑定到另一个视图

时间:2012-09-03 08:43:43

标签: c# .net wpf

我有一个要求在我们的一个应用程序中实现,如下所示。我有一个查询如何在WPF中实现这一点。

  1. 我有一个主WPF窗口,分为左侧的树视图和带有一些文本框和组合框的窗体,右侧的复选框。

  2. 我想使用存储在树节点的标记值中的对象的相应值填充右侧表单。

  3. 每当我单击树视图上的特定节点时,右侧的表单字段将在其标记值中显示对象存储的内容,如果我在右侧表单字段中进行了一些修改,最终将更新。 / p>

  4. 有人可以提供示例应用程序的链接吗?

1 个答案:

答案 0 :(得分:0)

你的问题与WPF中一个非常基本的概念有关,即(Data) Binding。请从这篇文章开始。

请注意,将有趣/可编辑对象放在Tag TreeViewItem属性中对于UI设计来说是一个非常糟糕的主意。 Tag属性可以从代码中轻松访问,但是从UI开始,它将非常难以绑定到 - 所有这些因为TreeView本身只公开通常返回的SelectedItem/SelectedIndex属性数据项,而不是TreeViewItems

请玩这个例子:

<StackPanel Orientation="Horizontal">
    <TreeView x:Name="twi">
        <TreeViewItem Tag="one" Header="111">
            <TextBlock Text="First" />
        </TreeViewItem>
        <TreeViewItem Tag="two" Header="222">
            <TextBlock Text="Second" />
        </TreeViewItem>
        <TreeViewItem Tag="three" Header="333">
            <TextBlock Text="Third" />
        </TreeViewItem>
    </TreeView>
    <StackPanel Orientation="Vertical">
        <TextBlock Text="The text:" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Name}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Surname}" />
    </StackPanel>
</StackPanel>

这是整个样本,只需将它放在任何地方。左侧是项目,右侧是一些标签。当您单击TreeView时,标签将更新并显示所选内容以及其Tag属性。当然,TAG设置为简单的字符串,因此.Name和.Surname将不显示任何内容。但是,如果将TAG设置为某些数据对象,则会正确显示。请注意,如果您单击TWI,它将按预期执行,但如果您单击TWI的,则不会 - 总而言之,是选择了子文本!

您需要非常小心在树视图中放置的内容,并且非常小心标记值的内容/位置。这不是一个好方法。更典型的是,您:

public class Person
{
    // properties
    public string Name { .... }
    public string Surname { ... }

    public List<Person> Subordinates { .... }
}

<StackPanel Orientation="Horizontal">
    <TreeView x:Name="twi">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Subordinates}">
                <TextBlock>
                    <Run Text="{Binding Name}" />
                    <Run Text=" " />
                    <Run Text="{Binding Surname}" />
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    <StackPanel Orientation="Vertical">
        <TextBlock Text="The selected person:" />
        <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Name, Mode=TwoWay}" />
        <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Surname, Mode=TwoWay}" />
    </StackPanel>
</StackPanel>

当然,创建一些示例数据并将其作为ItemsSource提供给treeView。 这样,TreeView将自动创建项目,应用模板,每次点击时,SelectedItem都不会为您提供TreeViewItem,但是 - Person可以直接编辑。因此,在窗口的右侧,对SelectedItem.Name的简单绑定将“正常工作”,如果您将其设为双向,则它将直接更新Person。

免责声明:我没有运行代码。可能存在错误和拼写错误。代码只是为了显示一般的想法。