根据TreeView中SelectedItem的级别设置TextBox文本
本文关键字:设置 TextBox 文本 TreeView SelectedItem 根据 | 更新日期: 2023-09-27 18:20:11
在我的控件上是一个TreeView,它有一组项,可以在三个级别中的一个级别中。TreeView中的对象有一个名为Level的属性,它决定了这一点。树视图下有一些文本框。应根据TreeView中SelectedItem的级别填充文本框。如果选择了顶层的项目,则只应填充第一个TextBox。如果选择了第二级的项目,则应填写第一个和第二个TextBox,依此类推。这是TreeView:中项目的结构
-Item1 <- Level = 0
-- SubItem1 <- Level = 1
-- SubSubItem1 <- Level = 2
-- SubSubItem2
-Item2 <- Level = 0
-- SubItem1 <- Level = 1
-- SubSubItem1 <- Level = 2
-- SubItem2
-- SubSubItem1
我试图在TreeView的HierarchicalDataTemplate和TextBox的样式中都使用触发器来简化此任务。TreeView的层次结构DataTemplate的问题是,我无法访问TextBox,因为它(TextBox)不在DataTemplate的范围内,也不编译。另一次尝试根本没有结果。这是我控制的XAML:
<TreeView Grid.Row="1" Margin="5" ItemsSource="{Binding Privileges}" Name="Privileges">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Items}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<TextBox Grid.Row="0" Margin="3">
<TextBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Privileges.SelectedItem.Level}" Value="0">
<Setter Property="TextBox.Text" Value="Test"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
您不能直接获得级别(如这里所解释的)。但您可以调整上述链接中的一个函数并进行计算:
private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
int level = FindTreeLevel((TreeViewItem)treeView1.SelectedItem);
if (level == 0)
{
textBox1.Text = "Item1";
}
else if (level == 1)
{
textBox1.Text = "Item1";
textBox2.Text = "SubItem1";
}
//etc.
}
private int FindTreeLevel(TreeViewItem control)
{
var level = 0;
if (control != null)
{
var parent = VisualTreeHelper.GetParent(control);
while (!(parent is TreeView) && (parent != null))
{
if (parent is TreeViewItem)
level++;
parent = VisualTreeHelper.GetParent(parent);
}
}
return level;
}