2013-08-28 2 views
0

меня есть два классаМОФ MVVM рекурсивное дерево

public class leaf 
{ 
    public string name { get; set; } 
} 

и

public class node 
{ 
    public ObservableCollection<node> nodeList = new ObservableCollection<node>(); 
    public ObservableCollection<leaf> leafList = new ObservableCollection<leaf>(); 
    public ObservableCollection<node> prop_nodeList { get { return nodeList; } set { nodeList = value; } } 
    public ObservableCollection<leaf> prop_leafList { get { return leafList; } set { leafList = value; } } 

    public string name { get; set; } 
} 

как вы можете видеть свою работу как дороги или дерево. узел может иметь информацию о другом узле и листе.

я хотел бы показать в дереве управления пользователя отформатированные как этот

i make it with using Recursiv tree

nethead является основным узлом, а его иметь два другой узел (Ь, а). узел a имеет два узла (b, c) и 2 листа (a1, a2). но я не делаю этого с mvvm. когда я делаю это с MVVM его похожим

i make it with mvvm

из C# я делаю только

this.DataContext = mainNode; // its node which hold everething (its named netHead) 

из XAML его

<Grid> 
    <TreeView ItemsSource="{Binding prop_nodeList}"> 
     <TreeView.Resources> 

      <HierarchicalDataTemplate DataType="{x:Type local:node}" ItemsSource="{Binding prop_nodeList}"> 
       <TextBlock Text="{Binding Path=name}"/> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type local:leaf}" ItemsSource="{Binding prop_leafList}"> 
       <TextBlock Text="{Binding Path=name}"/> 
      </HierarchicalDataTemplate> 


     </TreeView.Resources> 
    </TreeView> 
</Grid> 

вы видите, что я хочу сделать? Я хочу сделать двойной treeItem в TreeView, но он не работает :( , пожалуйста, помогите, его проект для Ant Algorithm, и я хочу сделать лучший gui в классе.

+0

привет, вы используете HierarchicalDataTemplate неправильно. посмотрите на msdn, как правильно использовать его. http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx btw there aint лучше gui, чем старая консоль школы hehe –

+0

Спасибо, я didnt знайте это раньше. но я до сих пор не знаю, как сделать двойной элемент в ItemTemplate – Jan3Sobieski

ответ

0

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

Что касается листьев, которые не отображаются ... вам нужен DataTemplate для них, а не HierarchicalDataTemplate. Я подозреваю, что ошибки привязки мешают ему правильно отображать, поскольку у листьев нет детской коллекции.

Только что заметил, что это своего рода вопрос о домашнем задании, поэтому я не буду продолжать дольше. Посмотрите на ошибки привязки (ena чтобы трассировать WPF, чтобы увидеть их в окне вывода) и попытайтесь понять это оттуда.

1

Немного изменил ваш код: Реализована модель корневого представления NodesData, чтобы продемонстрировать и создать данные запуска. Также добавлено свойство «Дети» иметь одно свойство для дочерних узлов узла. А также слегка измененный xaml для использования единого иерархического шаблона данных. И кажется, что это работает.

public class leaf 
{ 
    public string name { get; set; } 
} 

public class node 
{ 
    public string name { get; set; } 
    public ObservableCollection<node> nodeList = new ObservableCollection<node>(); 
    public ObservableCollection<leaf> leafList = new ObservableCollection<leaf>(); 
    public ObservableCollection<node> prop_nodeList { get { return nodeList; } set { nodeList = value; } } 
    public ObservableCollection<leaf> prop_leafList { get { return leafList; } set { leafList = value; } } 

    public ObservableCollection<object> Children 
    { 
     get 
     { 
      var children = prop_nodeList.OfType<object>(); 
      return new ObservableCollection<object>(children.Concat(prop_leafList.OfType<object>())); 
     } 
    } 

} 

public class NodesData 
{ 
    public ObservableCollection<node> RootSource { get; set; } 

    public NodesData() 
    { 
     var rootNode = new node() { name = ">>>Head Node<<<<" }; 


     var b = new node() { name = "b" }; 
     var c = new node() { name = "c" }; 
     var a = new node() 
        { 
         name = "a", 
         prop_nodeList = new ObservableCollection<node>() { b, c }, 
         prop_leafList = new ObservableCollection<leaf>() { new leaf() { name = "a1" }, new leaf() { name = "a2" } } 
        }; 
     rootNode.prop_nodeList = new ObservableCollection<node>() { b, a }; 

     RootSource = new ObservableCollection<node>() { rootNode }; 
    } 
} 

}

XAML:

<Grid> 
    <Grid.Resources> 
     <wpfApplication1:NodesData x:Key="dataSource"/> 
    </Grid.Resources> 
    <TreeView ItemsSource="{Binding RootSource}" DataContext="{StaticResource dataSource}"> 
     <TreeView.Resources> 

      <HierarchicalDataTemplate DataType="{x:Type wpfApplication1:node}" ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding Path=name}"/> 
      </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type wpfApplication1:leaf}" > 
       <TextBlock Text="{Binding Path=name}"/> 
      </DataTemplate> 



     </TreeView.Resources> 
    </TreeView> 
</Grid> 
+0

Спасибо, его очень полезно. и если вы не помогли мне с моим следующим вопросом, я бы использовал его. мой вопрос: «Есть ли способ сделать это с двумя ObservableCollection?» – Jan3Sobieski

+0

и без наследования – Jan3Sobieski

+0

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