0

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

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

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

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

任何人都可以提供示例应用程序的链接吗?

4

1 回答 1

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属性。当然,标签被设置为简单的字符串,所以 .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 都不会为您提供TreeViewItems,而是 - with Person,可以直接编辑。因此,在窗口的右侧,简单绑定到SelectedItem.Name将“正常工作”,如果您将其设为 2-way,它将直接更新 Person。

免责声明:我没有运行代码。可能有错误和错别字。代码只是为了展示总体思路。

于 2012-09-03T10:07:26.100 回答