我有一个要求在我们的一个应用程序中实现,如下所示。我有一个查询如何在WPF中实现这一点。
我有一个主WPF窗口,分为左侧的树视图和带有一些文本框和组合框的窗体,右侧的复选框。
我想使用存储在树节点的标记值中的对象的相应值填充右侧表单。
每当我单击树视图上的特定节点时,右侧的表单字段将在其标记值中显示对象存储的内容,如果我在右侧表单字段中进行了一些修改,最终将更新。 / p>
有人可以提供示例应用程序的链接吗?
答案 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。
免责声明:我没有运行代码。可能存在错误和拼写错误。代码只是为了显示一般的想法。