#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>