2014-10-22 2 views
0

У меня есть следующий ViewModel класс:Иерархическая привязка в WPF TreeView не работает на кнопку мыши

public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel() 
    { 
     m_folders = new List<Folder>(); 
    } 

    private List<Folder> m_folders; 
    public List<Folder> Folders 
    { 
     get { return m_folders; } 
     set 
     { 
      m_folders = value; 
      NotifiyPropertyChanged("Folders"); 
     } 
    } 

    void NotifiyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

и класс Папка:

public class Folder 
{ 
    public Folder() 
    { 
     Folders = new List<Folder>(); 
    } 

    public string FullPath 
    { 
     get; 
     set; 
    } 

    public string FolderLabel 
    { 
     get; 
     set; 
    } 

    public List<Folder> Folders 
    { 
     get; 
     set; 
    } 
} 

Класс ViewModel является привязываться к TreeView, как это:

<TreeView ItemsSource="{Binding Folders}" Margin="10" Height="200" Name="treeView"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Folders}" DataType="{x:Type local:Folder}" > 
       <TextBlock Text="{Binding FolderLabel}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

Само связывание выполняется в событии загрузки окна, а затем я заполняю объект:

public ViewModel model = new ViewModel(); 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     treeView.DataContext = model; 

     //add Root items 
     model.Folders.Add(new Folder { FolderLabel = "Dummy1", FullPath = @"C:\dummy1" }); 
     model.Folders.Add(new Folder { FolderLabel = "Dummy2", FullPath = @"C:\dummy2" }); 
     model.Folders.Add(new Folder { FolderLabel = "Dummy3", FullPath = @"C:\dummy3" }); 
     model.Folders.Add(new Folder { FolderLabel = "Dummy4", FullPath = @"C:\dummy4" }); 

     //add sub items 
     model.Folders[0].Folders.Add(new Folder { FolderLabel = "Dummy11", FullPath = @"C:\dummy11" }); 
     model.Folders[0].Folders.Add(new Folder { FolderLabel = "Dummy12", FullPath = @"C:\dummy12" }); 
     model.Folders[0].Folders.Add(new Folder { FolderLabel = "Dummy13", FullPath = @"C:\dummy13" }); 
     model.Folders[0].Folders.Add(new Folder { FolderLabel = "Dummy14", FullPath = @"C:\dummy14" }); 

     model.Folders[0].Folders[0].Folders.Add(new Folder { FolderLabel = "MyDummy1", FullPath = @"xxxxxx" }); 
    } 

Пока что так хорошо. Все работает хорошо. Затем я добавляю кнопку в форму и удаляю заполняемый код из загрузки формы и помещаю ее в щелчок кнопки. Он больше не работает. Связывание TreeView больше не работает. Я делаю что-то неправильно?

ответ

3

Потому что вы привязываете исходный код TreeView к List<Folder>. Исходное связывание будет работать, но дальнейшие обновления не будут отображаться в пользовательском интерфейсе, потому что List<T> внутренне не реализуют интерфейсы INotifyPropertyChanged и INotifyCollectionChanged. Вам необходимо заменить List<Folder> на ObservableCollection<Folder>.

+0

Работает как очарование. Спасибо за объяснение тоже – RBasniak

+0

добро пожаловать. – Crypt32

Смежные вопросы