2009-08-06 5 views
1

Кто-нибудь знает, как я могу получить SelectedItem (а не заголовок) из TreeView?
Вот мой код:Получить SelectedItem из TreeView?

<TreeView Name="treeView1" DataContext="{Binding Path=PresentationsViewModel}" Grid.Column="1" > 
    <TreeViewItem IsExpanded="True" Header="Objects-A-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListA}"></TreeViewItem> 
    <TreeViewItem IsExpanded="True" Header="Objects-B-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListB}"></TreeViewItem> 
    <TreeViewItem IsExpanded="True" Header="Objects-C-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListC}"></TreeViewItem> 
</TreeView> 

Обратите внимание, что есть 3 различных списки, содержащие 3 различных объектов-типов. Было бы помочь мне много, чтобы иметь что-то вроде:

public Object SelectedObject 
{ 
    set { _selectedObject = value; RunMyMethod(); RaisePropertyChanged("SelectedObject"); } 
} 

Заранее спасибо!

Приветствия

+0

Что вы пытаетесь сделать? Почему TreeView.SelectedItem не работает для вас? – Andy

ответ

3

Хорошо, я знаю, что это старый вопрос и, вероятно, мертв, но, как Чарли, это правильно. Это то, что также можно использовать в коде. Например, вы можете сделать следующее:

<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" /> 

Wich покажет выбранный элемент. Вы можете добавить к нему стиль или DataTemplate или использовать объект DataTemplate по умолчанию для объекта, который вы пытаетесь показать.

+0

Как ваша модель просмотра может получить эту информацию? Я получаю, что ContentPresenter удерживает выбранный элемент, но как мы можем получить это до модели представления? –

+0

@ Bob Я думаю, вы могли бы привязать SelectedItem в treeview к свойству viewModel. Затем вы также можете привязать это свойство к contentPresenter или любой другой форме, в которой вы хотите ее представить. Убедитесь, что на нем работает INotify. Поэтому, когда вы меняете SelectedItem, должны обновляться как ViewModel, так и представление (если вы хотите) в представлении. –

+0

Но вся проблема в первую очередь заключается в том, что SelectedItem в дереве только для чтения и не может использоваться в XAML. Нет? –

0

Может быть, я неправильно понял ваш вопрос, но,

treeView1.SelectedItem 

Должно работать.

+1

Я пытаюсь сделать это без каких-либо Code-Behind, просто через К сожалению TreeView не имеет этого (но ListView, например, имеет его) –

+0

Это работает, человек! Hahahahaa –

4

Шаг 1 Установите NuGet: Install-Package System.Windows.Interactivity.WPF

Шаг 2 в теге вашего окна добавления: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Шаг 3 В TreeView добавить:

<TreeView Name="treeView1" ... > 
     <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectedItemChanged"> 
        <i:InvokeCommandAction Command="{Binding SelectedItemChangedCommand}" CommandParameter="{Binding ElementName=treeView1, Path=SelectedItem}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
    ... 
    </TreeView> 

Шаг 4 В вашей ViewModel добавить:

 private ICommand _selectedItemChangedCommand; 
     public ICommand SelectedItemChangedCommand 
     { 
      get 
      { 
       if (_selectedItemChangedCommand == null) 
        _selectedItemChangedCommand = new RelayCommand(args => SelectedItemChanged(args)); 
       return _selectedItemChangedCommand; 
      } 
     } 

     private void SelectedItemChanged(object args) 
     { 
      //Cast your object 
     } 
+0

Спасибо за решение :) – Pentarex