Установите текст TextBox в зависимости от уровня SelectedItem в TreeView

В моем элементе управления есть TreeView с набором элементов, которые могут находиться на одном из трех уровней. Объекты внутри TreeView имеют свойство, называемое Level, которое определяет это. Под TreeView есть несколько текстовых полей. Текстовые поля следует заполнять в зависимости от уровня SelectedItem в TreeView. Если выбран элемент на верхнем уровне, следует заполнить только первое текстовое поле. Если выбран элемент на втором уровне, следует заполнить первый, второй TextBox и так далее. Это структура элементов в TreeView:

 -Item1                  <- Level = 0
 -- SubItem1             <- Level = 1
  -- SubSubItem1         <- Level = 2
  -- SubSubItem2
 -Item2                  <- Level = 0
 -- SubItem1             <- Level = 1
  -- SubSubItem1         <- Level = 2
 -- SubItem2
  -- SubSubItem1

Я попытался выполнить эту задачу с помощью триггера как в HierarchicalDataTemplate TreeView, так и в стиле TextBox. Проблема с HierarchicalDataTemplate TreeView заключается в том, что у меня нет доступа к 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>

person Romano Zumbé    schedule 27.06.2013    source источник


Ответы (1)


Вы не можете получить уровень напрямую (как описано здесь). Но вы можете адаптировать одну из функций в вышеупомянутой ссылке и рассчитать ее:

    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;
    }
person varocarbas    schedule 27.06.2013
comment
У меня уже есть уровень как свойство TreeeViewItem. Устанавливается при его заполнении. Мой вопрос заключался в том, как я могу установить текст TextBox в зависимости от этого свойства Value. Я думаю, что в этом контексте «Уровень» может немного сбивать с толку как имя свойства. У тебя есть идеи? - person Romano Zumbé; 27.06.2013
comment
И это не должно работать из кода, так как я хочу использовать строгий подход MVVM. - person Romano Zumbé; 27.06.2013
comment
Нет, пожалуйста, оставь это. Мог бы прояснить ситуацию для кого-то еще, кто мог бы мне помочь. Спасибо :-) - person Romano Zumbé; 27.06.2013
comment
В ПОРЯДКЕ. Тогда я оставлю это. Удачи. - person varocarbas; 27.06.2013