2013-12-21 2 views
1

Ошибка при выборе моего дерева. Идея заключается в том, что пользователь нажимает на элемент и данные добавляются в узле, который они выбралиTreeView Selected Item Change

public MainWindow() 
    { 
     InitializeComponent(); 
     this.UserControl1.TreeView1.SelectedItemChanged += new RoutedPropertyChangedEventHandler<Object>(InterfaceTreeViewComputers_SelectionChange); 
    } 

    void InterfaceTreeViewComputers_SelectionChange(Object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     var MyTreeView = MainWindow.UserControl1.Treeview1.Items.SourceCollection; 
     var TheSource = sender as TreeView; 
     var TheProperty = e.Source; 
     var ThePropertyAsTreeView = TheProperty as TreeView 

     TreeViewItem item = e.OriginalSource as TreeViewItem; //Equals Null 
     var Attempt2 = ThePropertyAsTreeView.SelectedItem //Equals Null 
     var Attempt3 = TheSource.SelectedItem as TreeViewItem //Equals Null 
     var Attempt4 = TheSource.SelectedItem //Equals onbject(String) 
    } 

кажется, что выбранный элемент является TextBlock и я не могу показаться, чтобы найти способ, чтобы получить его в виде дерева элемент для добавления узлов под ним.

Да, я довольно новичок в этом программировании.

Благодарим за любую помощь, которую вы можете предоставить.

ответ

1

Попробуйте получить выбранный товар:

TreeViewItem item = e.NewValue as TreeViewItem; 

Или это получить ранее выбранный элемент:

TreeViewItem item = e.OldValue as TreeViewItem; 

e.Source и e.OriginalSource сослаться на TreeView выбранного не TreeViewItem. Вы можете использовать точку останова, затем увидеть эти значения свойств и ввести часы Visual Studio. Это то, что я делал, прежде чем публиковать это.

+0

Благодарим вас за ответ. это сработало для меня. я попытался дать вам +1 или то, что вы хотите назвать, но говорит, что мне нужна репутация, чтобы сделать это. –

+0

После большего тестирования это разрешение сработало для корневых узлов, но не для моих дочерних узлов. public void AddComputer (строковый идентификатор) { TreeViewItem NewItem = new TreeViewItem(); NewItem.Header = Идентификатор; TreeView1.Items.Add (NewItem); } Xaml Код

+0

, что вы имеете в виду, что не работает для дочерних узлов? Он должен работать для любого узла TreeView, я имею в виду, что вы можете выбрать выделенный элемент таким образом для любого выбранного узла (root или child). Попробуйте отправить еще один вопрос с обновленным кодом .. и в чем проблема – har07

2

Я считаю, что вы приближаетесь к этому неправильно. Большинство ваших проблем исчезнут, если вы используете DataBinding для заполнения TreeView. Примите во внимание следующий класс

namespace StackOverflow._20716616 
{ 
    public class Model 
    { 
     public Model() 
     { Items = new ObservableCollection<Model>(); } 
     public Model(string text) 
      : this() 
     { Text = text; } 
     public string Text { get; set; } 
     public ObservableCollection<Model> Items { get; set; } 
    } 
} 

Используя этот класс в качестве модели в шаблон MVVM, я могу создать иерархическую граф объектов, которые можно связать с TreeView с помощью ItemsSource и HierarchicalDataTemplate как

<TreeView ItemsSource="{Binding Path=Items}" SelectedItemChanged="TreeView_OnSelectedItemChanged"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type this:Model}" ItemsSource="{Binding Path=Items}"> 
      <TextBlock Text="{Binding Path=Text}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

DataContext окна был установлен на корневой узел XAML

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

в коде позади, я заполнить корневые элементы на TreeView

public MainWindow() 
{ 
    Items = new ObservableCollection<Model>() { new Model("one"), new Model("two"), new Model("three") }; 
    InitializeComponent(); 
} 

public ObservableCollection<Model> Items { get; set; } 

Затем в SelectedItemChanged, я могу просто добавить детей графа объектов

private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    var model = e.NewValue as Model; 

    if (!model.Items.Any()) 
    { 
     new List<Model>() { new Model("one"), new Model("two"), new Model("three") } 
      .ForEach(model.Items.Add); 
    } 

    // expand the selected item. 
    var item = ((TreeView)sender).ItemContainerGenerator.ContainerFromItem(model) as TreeViewItem; 
    item.IsExpanded = true; 
} 

Примечание, это MVVM бедняка, где я использовал код Windows, за как ViewModel. Для краткости я также оставил нулевые проверки и исключение исключений.

Я надеюсь, что это поможет

0

Ваше право, мне очень жаль. http://www.dotnetperls.com/ дали мне кучу insite на этом языке.

Я тоже привык к программированию в таких вещах, как Visual Basic и Delphi. Теперь я понимаю, что мой MainWindow должен выполнять все физические действия для моего интерфейса переднего интерфейса, а классы в других пространствах имен не делают этого.

Я понял, что вы вызываете класс для выполнения определенной операции. класс затем либо возвращает информацию, либо сохраняет информацию в общедоступной собственности. в котором MainWindow может использовать это и выполнять требуемое действие. Это я не понял и пытался манипулировать моим пользовательским интерфейсом из других классов.

С тех пор я сменил проект, и информация, предоставленная здесь, помогла мне с моими событиями.

теперь у меня есть пользовательский интерфейс, закодированный в XAML главного окне (события Performin и обновление пользовательского интерфейса) Других курсами (Получение данных, или проектирование элементов управления), поэтому основное окно можно добавить элемент управления или данные в пользовательский интерфейс.

Теперь я наматываю как нуб.