2012-02-28 4 views
2

У меня есть TreeView, который использует HierarchicalDataTemplate и модель представления в качестве контекста данных на разных узлах. Я хочу получить доступ к некоторым свойствам TreeViewItem из TreeView.SelectedItem - но это возвращает объект модели представления, а не TreeViewItem.
Как получить ссылку TreeViewItem для выбранного элемента?
(Ive та же проблема в SelectedItemChanged обработчиков - объект отправителя вид модели - как получить TreeViewItem?)
[Там есть TreeView свойство SelectedContainer который возвращает TreeViewItem, но его не :-(], доступнуюТип возврата TreeView SelectedItem

В этом это своего рода разочарование в отношении WFP, так это то, что легко застрять на этой «детали», и кажется, что должно быть простое/очевидное решение, но ...

+0

Возможный дубликат [Получение TreeViewItem для выбранного элемента в TreeView в WPF] (http://stackoverflow.com/questions/5218364/getting-treeviewitem-for-the-selected-item-in-a-treeview -in-wpf) –

ответ

1

Как только вы привязали свой TreeView к контекст данных, вы всегда будете возвращать объекты модели представления. Если вы хотите манипулировать объектами TreeViewItem в ответ на события, вам нужно сделать это с помощью привязок. Например, IsExpanded, IsSelected proper привязки могут быть привязаны к свойствам view-model, используя стили. Следующий код автоматически выделяет выделенный элемент дерева и связывает вышеупомянутые свойства с параметрами view-model, где я могу манипулировать/читать их.

 <TreeView x:Name="treeEquipment" 
       ItemsSource="{Binding RootEquipment}" 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <EventSetter Event="TreeViewItem.MouseRightButtonDown" 
          Handler="TreeViewItem_MouseRightButtonDown"/> 
       <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       <Setter Property="FontWeight" Value="Normal" /> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TreeView.ItemContainerStyle> 
+0

Спасибо, что помогли. Фактически я пытался отключить выбор узла дерева (потому что я управляю несколькими выделениями самостоятельно). Таким образом, привязка к свойству модели представления, которая всегда возвращала false, работала. – Ricibob

+0

К @Ricibob, на самом деле вы в конечном итоге использовали свойство SelectedItem, к которому был связан ваш контроль? (Если да, то как? Я в одной лодке) – Rachael

+1

@ UB3571 Нет. Я не получал доступ к свойству SelectedItem, но сделал так, как предложил StrayPointer и «сопоставил» поля TreeViewItem, которые мне нужны для моего объекта модели модели со связями, - а затем доступ их через объект модели представления. – Ricibob

0

Свойство, которое я пытался установить, было IsSelected, которое я всегда искал, потому что я управляю несколькими выборами самостоятельно. После консультации StrayPointers, который работает с привязкой на режим просмотра:

class TreeNodeViewMode { 
    public bool no_selection { 
     get { return false; } 
     set { RaisePropertyChanged(); } 
    } 
} 

XAML:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsSelected" Value="{Binding no_selection, Mode=TwoWay}" /> 
    </Style> 
</TreeView.ItemContainerStyle> 
0

Другой подход состоит в обработке TreeViewItem.Selected событие, которое в отличие от TreeView.SelectedItemChanged (который получает модель представления передается в) это действительно становится нам TreeViewItem через:

TreeViewItem item = e.OriginalSource as TreeViewItem; 

Что позволяет устанавливать свойства, например

TreeViewItem item = e.OriginalSource as TreeViewItem; 
if (item != null) { 
    item.Focus(); 
    item.IsSelected = false; 
} 
Смежные вопросы