0

在我的控件上是一个带有一组项目的 TreeView,这些项目可以位于三个级别之一。TreeView 中的对象有一个名为 Level 的属性来确定这一点。在 TreeView 下有一些文本框。应根据 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 的 HierarchicalDataTemplate 的问题是,我无法访问 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>
4

1 回答 1

0

您无法直接获得关卡(如此处所述)。但是您可以调整上述链接中的功能之一并计算它:

    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;
    }
于 2013-06-27T13:45:09.150 回答