У меня есть рекурсивная viewmodel, которая использует для treeview. Проблема заключается в том, что каждый раз я удаляю элемент группы или элемент позиции. Древовидное представление не может сразу отразить изменение, пока я не заставляю его treeview.Items.Refresh(). Я предполагаю, что элементы ObservableCollection получили уведомление. Не могли бы вы указать мне. Благодарю.
ViewModel
public class Group:ViewModelBase
{
private int _key;
public int Key
{
get { return _key; }
set { _key = value; OnPropertyChanged("Key"); }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
private bool _isexpanded;
public bool IsExpanded
{
get { return _isexpanded; }
set { _isexpanded = value; OnPropertyChanged("IsExpanded"); }
}
private int _order;
public int Order
{
get { return _order; }
set { _order = value; OnPropertyChanged("Order"); }
}
private int _grouporder;
public int GroupOrder
{
get { return _grouporder; }
set { _grouporder = value; OnPropertyChanged("GroupOrder"); }
}
private string _error;
public string Error
{
get { return _error; }
set { _error = value; OnPropertyChanged("Error"); }
}
private ObservableCollection<Group> _subgroups;
public ObservableCollection<Group> SubGroups
{
get { return _subgroups; }
set { _subgroups = value;
OnPropertyChanged("SubGroups");
OnPropertyChanged("Entries");
}
}
private ObservableCollection<Entry> _entries;
public ObservableCollection<Entry> Entries
{
get { return _entries; }
set { _entries = value;
OnPropertyChanged("SubGroups");
OnPropertyChanged("Entries"); }
}
public ObservableCollection<object> Items
{
get
{
ObservableCollection<object> childNodes = new ObservableCollection<object>();
foreach (var entry in this.Entries)
childNodes.Add(entry);
foreach (var group in this.SubGroups)
childNodes.Add(group);
return childNodes;
}
}
}
Переплет:
public MainWindow()
{
InitializeComponent();
treeview.ItemsSource = Groups;
this.DataContext = this;
}
Проблема в том, что вы нарушаете связь с оригинальными коллекциями.
Поэтому я могу представить два решения:
1) Регистрация изменений на Entries
и SubGroups
и применить их к Items
:
private ObservableCollection<object> items;
public ObservableCollection<object> Items
{
get
{
if (items == null)
{
items = new ObservableCollection<object>();
foreach (var entry in this.Entries)
items.Add(entry);
foreach (var group in this.SubGroups)
items.Add(group);
this.Entries.CollectionChanged += (s, a) =>
{
if (/*add some stuff*/)
{
items.Add(/*some stuff*/)
}
else if (/*remove some stuff*/)
{
items.Remove(...)
}
};
this.SubGroups.CollectionChanged += ...
return items;
}
}
}
И вы сбросите items
, установив его на null
каждый раз, когда вы устанавливаете Entries
или SubGroups
чтобы в следующий раз он был регенерирован с учетом новых Entries
и SubGroups
.
2) Попробуйте с помощью CompositeCollection
:
new CompositeCollection
{
new CollectionContainer { Collection = this.Entries },
new CollectionContainer { Collection = this.SubGroups }
};
Не уверен, что это второе решение, но было бы довольно элегантно, стоит попробовать...