ObservableCollection с помощью конструктора Injection - Уведомление об изменениях в коллекции? - PullRequest
1 голос
/ 13 октября 2010

У меня есть два следующих класса:

(1) IViewModelManager (2) WorkspaceViewModel

IViewModelManager имеет коллекцию ObservableCollection.

IViewModelManager внедряется в конструктор WorkspaceViewModel.

У меня есть представление, которое привязывается к WorkspaceViewModel, и в представлении есть ListBox, который необходимо привязать к коллекции в WorkspaceViewModel. Если я определю свойство только для чтения в WorkspaceViewModel, которое возвращает ObservableCollection в IViewModelManager - изменения в ObservableCollection всегда будут всплывать до пользовательского интерфейса? Например, если у меня есть другой класс с именем ViewModelManager, производный от IViewModelManager, и я выполняю некоторую функцию в ViewModelManager, которая добавляет элемент в ObservableCollection, будет ли ListBox в представлении, которое привязывается к классу WorkspaceViewModel, воспринимать это изменение? Если нет, есть идеи о том, как реализовать это, используя архитектуру, которую я описал?

Chris

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Да, изменения будут отправлены в пользовательский интерфейс.ListBox привязывается к экземпляру ObservableCollection напрямую;он только использует путь свойства привязки, чтобы определить, как туда добраться.

0 голосов
/ 14 октября 2010

Да, с оговоркой.Если ваш экземпляр IViewModelManager заменяет ObservableCollection, ваш View не заметит.Например:

public class VMMgr : IViewModelManager
{
    private ObservableCollection _oc;

    public ObservableCollection Collection { get { return _oc; } }

    // other implementation

    public void DoNaughtyThings()
    {
        _oc = new ObservableCollection();
    }
}

Если кто-то приходит и изменяет _oc для указания на другой экземпляр ObservableCollection (например, вызывает DoNaughtyThings ()), ваше мнение не заметит, что оно изменилось.

Мое соглашение об этом состояло в том, чтобы ViewModels наследовал от DependencyObject и представлял все, что View связывает как DependencyProperties.YMMV, HTH.

0 голосов
/ 13 октября 2010

со стороны просмотра:

Установите ItemsSource в Listbox для привязываемого свойства, например так:

ItemsSource="{Binding Path=BindingName, Mode=OneWay}"

со стороны модели:

Объявить собственность следующим образом:

  private ObservableCollection<T> _BindingName = new ObservableCollection<T>();
    public ObservableCollection<T> BindingName {
        get { return _BindingName; }
        set {
            _BindingName = value;
            NotifyPropertyChanged("BindingName");
        }
    }

Каждый раз, когда вы изменяете это свойство, вам нужно вызывать событие propertyChanged, чтобы привязка отражала изменения в интерфейсе пользователя.

...