WPF ViewModel Issue

1

У меня есть рекурсивная 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;


    }
Теги:
wpf

1 ответ

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 <T>, всегда вызывайте Clear () и Add (), в противном случае вы перезаписываете информацию привязки.
  • 0
    @Pragmateek, спасибо !! ты спас мой день. Я пошел с композитной коллекцией!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню