2014-08-28 2 views
1

У меня есть рекурсивная viewmodel, которая используется для древовидной структуры. Проблема заключается в том, что каждый раз я удаляю элемент группы или элемент позиции. Древовидное представление не может сразу отразить изменение, пока я не заставляю его treeview.Items.Refresh(). Я предполагаю, что элементы ObservableCollection получили уведомление. Не могли бы вы указать мне. Благодарю.WPF ViewModel Issue

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

Вопрос заключается в том, что вы разорвать связь с оригинальными коллекциями.

Так что я могу представить себе два решения:

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 } 
}; 

Не уверен, что для этого второго решения, но это было бы совсем шикарно, стоит попробовать ...

+0

право. Никогда не устанавливайте свойство ObservableCollection , всегда вызывайте Clear() и Add(), иначе вы переписываете информацию привязки. –

+0

@Pragmateek, Спасибо, ты спас мой день. Я пошел с композитным собранием !! –

+0

@ JerryNixon-MSFT спасибо! –