2012-06-26 8 views
5

В Visual C++/MFC мы использовали для добавления узла в дерево, а затем, ссылаясь на узел, мы могли добавлять дочерние элементы в родительский узел. Однако в WPF нет такой вещи, как я вижу. Я смущен, как я могу добавить детей/детей к узлу?Добавление узлов под узел в WPF treeview

любая помощь будет оценена по достоинству.

Кажется, 2 человека знают MVVM уже!

Решение предоставлено Тимом ниже.

+0

На самом деле это именно то, как вы это делаете в WPF, если вы не используете Binding ... – Tim

+0

@ В этом случае вы можете добавить только один элемент, если вы попытаетесь добавить child (ren) в элемент selectedItem вернет значение null. –

+1

Что? Вы правы, вы не можете сделать это одним звонком (на ItemCollection нет функции AddRange (...)), но вы можете просто добавить больше. 'var item = new TreeViewItem(); myTreeView.Items.Add (пункт); var subItem1 = new TreeViewItem(); var subItem2 = новый TreeViewItem(); item.Items.Add (subItem1); item.Items.Add (subItem2); 'Или сделать это как часть цикла. Я не понимаю, в чем проблема. – Tim

ответ

8

Быстрый поиск по Google "wpf treeview" нашел несколько замечательных статей о том, как правильно использовать древовидные структуры в WPF.

Пример 1: http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode

Пример 2: http://www.c-sharpcorner.com/uploadfile/mahesh/treeview-in-wpf/

Это поможет вам начать - обновить ваш вопрос, когда вы попробовали подход MVVM и более конкретные вопросы.

+0

Первый пример Я нашел его, но надеялся на более короткий путь, чтобы заставить его работать, но кажется, что нет коротких путей. 2-й пример - это то, что я сделал и не будет полезен, и даже его код неправильный (попробуйте сделать zip-файл, не будет работать и не скажет, что вам нужно добавлять дочерние элементы в узел, в котором я уже добавил родителя ... Я был ищет добавления узлов для детей), поэтому я поеду с первым, чтобы провести время и изучить его. в любом случае, интересно, как люди отрицательно относятся к моему вопросу, но на них не ответили. спасибо EtherDragon –

+0

Хорошо, я просмотрел первый образец и получил некоторые идеи о MVVM, но честно, но я не знаю, как начать писать простую программу, используя ее. Может ли кто-нибудь мне помочь? Я вижу разделение зрения от данных и т. Д., Но пока не знаю, как начать и даже связать эти вещи вместе. Любые советы будут оценены. –

+0

Начало работы witn WPF/MVVM - http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial и http://www.codeproject.com/Articles/81484/A-Practical- Quick-start-Tutorial-on-MVVM-in-WPF. Если вы собираетесь работать в WPF, MVVM - это единственная игра в городе - WPF была построена на концепциях MVC, а MVVM - это специфическая интерпретация MVF WPF – EtherDragon

10

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

Что описывается в вопросе именно так, как вы могли бы это сделать в WPF. Например:

var item = new TreeViewItem(); 
myTreeView.Items.Add(item); 
var subItem1 = new TreeViewItem(); 
var subItem2 = new TreeViewItem(); 
item.Items.Add(subItem1); 
item.Items.Add(subItem2); 

Это добавит кучу пустых предметов.

Свойство заголовка каждого TreeViewItem можно использовать для управления отображаемым изображением и использования свойства Tag для хранения данных, если вы хотите пройти этот маршрут.

Возможно, было бы предпочтительным перейти по пути привязки и использовать HierarchicalDataTemplates для управления внешним видом. Таким образом, вы не вручную создаете эти поддельные контейнеры (TreeViewItems) для своих данных.

Я бы предложил читать HierarchicalDataTemplates, так как это даст вам достойный обзор того, как процесс должен работать с привязками. Также просто прочитайте о MVVM в целом.

+0

Хотя это технически ответ на поставленный вопрос (отсюда +1 от меня), это предложение использовать HierarchicalDataTemplates и придерживаться твердого MVVM, который поможет OP больше всего. – EtherDragon

+1

А если вы хотите добавить товар в определенное место в заказе? –

0

Создайте свою модель, как этот список

public class WrappedNode 
{ 
    public string Name { get; set; } 
    public ObservableCollection<WrappedNode> Nodes { get; set; } 

    public WrappedNode() 
    { 
     Nodes = new ObservableCollection<WrappedNode>(); 
    }   
} 

Узел вы хотите связать с TreeView

private ObservableCollection<WrappedNode> _nodeList; 
public ObservableCollection<WrappedNode> NodeList 
{ 
    get { return _nodeList; } 
    set 
    { 
     _nodeList = value; 
     RaisePropertyChanged(() => NodeList); 
    } 
} 

И в XAML:

<TreeView Grid.Row="1" 
       ItemsSource="{Binding NodeList}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type scnvm:WrappedNode}" ItemsSource="{Binding Nodes}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

Если вы хотите узла иметь детей, просто добавьте дочерний узел в свойство Nodes этого узла

0

Чтобы добавить элемент в качестве родителя:

var item = new TreeViewItem(); 
item.Header = "First Element"; 
tree.Items.Add(item); //tree is your treeview 

Для добавления элемента в качестве дочернего конкретного элемента:

var subItem = new TreeViewItem(); 
subItem.Header = "Subitem"; 
var parent = tree.SelectedItem as TreeViewItem; // Checking for selected element 
parent.Items.Add(subItem); 
Смежные вопросы