Проблема с ObservableCollection и INotifyPropertyChanged в MVVM - PullRequest
1 голос
/ 27 октября 2010

У меня есть элемент управления диаграммой в XAML и точки данных, которые привязаны к элементу управления.Проблема в том, что когда мой ModelView изменяет коллекцию точек, элемент управления Chart не получает никаких уведомлений.Я пробовал дп, с ObservableCollection и INotifyPropertyChanged без какой-либо удачи.Я знаю, что существует разница между изменением поля / свойства и выполнением операций сбора, таких как (добавление / удаление / замена и т. Д.), Чтобы изменения распространялись на элемент управления Chart.Но я не получил его на работу.Событие изменения срабатывает только тогда, когда я создаю экземпляр / переустанавливаю коллекцию.

Есть ли у кого-нибудь ссылка на работающий MVVM, который работает с коллекциями?

Стоит также знать.

<code>
public class ObservableCollection : Collection, INotifyCollectionChanged, INotifyPropertyChanged


        public static DependencyProperty WorkModelsProperty = DependencyProperty.Register("WorkModels", typeof(ObservableCollection), typeof(Chart),
            new PropertyMetadata(new ObservableCollection { }, new PropertyChangedCallback(
            (sender, args) =>
            {
                Debugger.Break(); //trigged only when collection got new instance
            })));

        public ObservableCollection WorkModels
        {
            get { return (ObservableCollection)GetValue(WorkModelsProperty); }
            set { SetValue(WorkModelsProperty, value); }
        }

Переплет правильный и проверен.Код в Window.Resources.

ObjectDataProvider ObjectType="{x:Type vm:ListWorkViewModel}" x:Key="ListWorkViewModel"

Привязка элемента управления.


WorkModels="{Binding Source={StaticResource ListWorkViewModel}, Path=WorkModels}"

В ViewModel я использую следующий код для повышения изменений.(При использовании INotifyPropertyChanged) </p> <pre> WorkModels.Add(workModel); this.RaisePropertyChanged("WorkModels"); protected void RaisePropertyChanged(string propertyName) { VerifyPropertyName(propertyName); if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }

Когда я использую ObservableCollection, я только добавляю новую точку данных в коллекцию.</p> <pre> WorkModels.Add(workModel);

Вопрос по шаблону MVVM на WPF?

Ответы [ 4 ]

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

Спасибо за ответы. Я нашел решение проблемы здесь. http://msdn.microsoft.com/en-us/library/aa970563.aspx

Для свойства зависимостей в целом шаблон реализации, который вы используете, заключается в том, что вы определяете оболочку свойства CLR, где это свойство поддерживается идентификатором DependencyProperty, а не полем или другой конструкцией. Вы следуете этому же шаблону при реализации свойства типа коллекции. Однако свойство типа коллекции создает некоторую сложность для шаблона всякий раз, когда тип, содержащийся в коллекции, сам является производным классом DependencyObject или Freezable.
0 голосов
/ 27 октября 2010

Вы пробовали что-то подобное ...

private IEnumerable<DataPoint> _DataPoints;
public IEnumerable<DataPoint> DataPoints
{
    get
    {
        return _DataPoints;
    }

    set
    {
        if (_DataPoints != value)
        {
            _DataPoints = value;
            this.OnPropertyChanged("DataPoints");
        }
    }
}

Затем, когда вы изменяете ЛЮБУЮ точку в коллекции DataPoints, вы вызываете событие изменения свойства для всего набора DataPoints

    /// <summary>
    /// Raised when a property on this object has a new value.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raises this object's PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">The property that has a new value.</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        //this.VerifyPropertyName(propertyName);

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

EDIT:
Попробуйте изменить тип ресурса с StaticResource на DynamicResource ...
http://msdn.microsoft.com/en-us/library/ms750613.aspx#staticdynamic
Ресурс может быть загружен с помощью страницы / окна и никогда не обновляться. Это объясняет отсутствие связи между событиями

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

У вас есть это:

WorkModels="{Binding Source={StaticResource ListWorkViewModel}, Path=WorkModels}"

Почему вы привязываетесь к статическому ресурсу? как определяется этот ресурс? Это в самом XAML? Вы действительно обновляете тот же экземпляр модели, к которому привязан элемент управления?

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

Нужно больше кода.Как вы связываете?К какому типу относится ObservableCollection?Вы уверены, что не замечаете в классе, который является значением ObservableColletion?

Редактировать: Также измените название вашего вопросаЭто немного двусмысленно и не совсем проблема вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...