WPF TreeView ObservableCollection, уведомляющий образец кода

#c# #wpf #treeview #observablecollection

#c# #wpf #просмотр дерева #observablecollection

Вопрос:

Я пытаюсь написать приложение C # WPF, и я застрял с TreeView и ObservableCollection.

Это мои элементы TreeView.

 | Root
--- SubItem
------ SubItem
| Root
--- SubItem
------ SubItem
---------- SubItem
  

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

Ответ №1:

Вот хороший пример для реализации Simplifying the WPF TreeView by Using the ViewModel Pattern .

Это просто еще один пример,

Ваша модель:

 public interface IFolder
{
    string FullPath { get; }
    string FolderLabel { get; }
    ObservableCollection<IFolder> Folders { get; } 
}
  

Ваша ViewModel:

 class ViewModel : INotifyPropertyChanged 
{
    public ViewModel()
    {

        m_folders = new ObservableCollection<IFolder>();

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

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

    }

    public string TEST { get; set; }


    private ObservableCollection<IFolder> m_folders;
    public ObservableCollection<IFolder> 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;
}
  

В xaml:

       <TextBlock Text="Simple root binding" Foreground="Red" Margin="10,10,0,0" />
        <TreeView ItemsSource="{Binding Folders}" Margin="10">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TreeViewItem Header="{Binding FolderLabel}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
  

Full code