我有一个要求在下面列出的我们的一个应用程序中实现。我有一个查询如何在 WPF 中实现这一点。
我有主 WPF 窗口,它分为左侧的树视图和带有一些文本框和组合框的表单,右侧的复选框。
我想用存储在树节点的标记值中的对象中的相应值填充右侧表单。
每当我单击树视图上的特定节点时,右侧的表单字段将在其标记值中显示对象存储的内容,如果我在右侧表单字段中进行一些修改,最终将被更新。
任何人都可以提供示例应用程序的链接吗?
您的问题与 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 都不会为您提供TreeViewItem
s,而是 - with Person
,可以直接编辑。因此,在窗口的右侧,简单绑定到SelectedItem.Name
将“正常工作”,如果您将其设为 2-way,它将直接更新 Person。
免责声明:我没有运行代码。可能有错误和错别字。代码只是为了展示总体思路。