Привязка данных в элементе управления WPF не выбирает новые данные из вызова IPropertyChangedNotify - PullRequest
0 голосов
/ 13 августа 2010

Обзор проекта

В основном я создавал приложение WPF с использованием шаблона MVVM.Однако у меня был поток, который обновлял мою модель данных, поэтому ViewModel нужно было уведомлять об этих изменениях, и мне требовался механизм уведомления в моей модели.Это заставило бы мое приложение распространять уведомления из одного класса в другой, поэтому я решил использовать модель, которая напрямую связана с View, я использовал некоторые другие методы, чтобы отделить мою модель от остальной части кода, поэтому моя логика по-прежнему была отдельнойиз моего пользовательского интерфейса.

Проблема

Когда My Thread изменяет значение в модели, он вызывает OnPropertyChanged(), однако мой вид не получает изменений.

Код (Это упрощенная версия моего проекта)

Нить, которая обновляет модель

class MyThread
{
    Model mdl;
    public MyThread()
    {
        mdl = new Model();
    }

    public Model getModel()
    {
        return mdl;
    }

    public void run()
    {
        while (true)
        {

            mdl.Age++;
            Thread.Sleep(1000);
        }
    }
}

Моя модель

class Model : INotifyPropertyChangedBase
{
    private int _age = 0;

    public int Age
    {
        get { return _age; }
        set
        {
            var init = _age;
            this.CheckPropertyChanged<int>("Age", ref init, ref value);
        }
    }
}

Мой вид имеет следующую привязку

<TextBlock Text="{Binding Age}" />

Код для INotifyPropertyChangedBase

namespace BindingTesting
{
    public abstract class INotifyPropertyChangedBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        #region Methods

        [Conditional("DEBUG")]
        [DebuggerStepThrough]
        public void VerifyPropertyName(string propertyName)
        {
            // verify that the property name matches a real,  
            // public, instance property on this object.
            if (TypeDescriptor.GetProperties(this)[propertyName] == null)
            {
                Debug.Fail("Invalid property name: " + propertyName);
            }
        }

        protected bool CheckPropertyChanged<T>(string propertyName, ref T oldValue, ref T newValue)
        {
            if (oldValue == null && newValue == null)
            {
                return false;
            }

            if ((oldValue == null && newValue != null) || !oldValue.Equals((T)newValue))
            {
                oldValue = newValue;
                OnPropertyChanged(propertyName);
                return true;
            }

            return false;
        }

        protected void OnPropertyChanged(string propertyName)
        {
            this.VerifyPropertyName(propertyName);

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

        #endregion
    }
}

Другая информация DataContext моего элемента управления присвоен моей модели.Это работает абсолютно правильно, если я использую DependecyProperty вместо этого.Метод get, вызывается, но данные не обновляются.

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

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

РЕДАКТИРОВАТЬ: Теперь я увидел вашу проблему:

public int Age
{
    get { return _age; }
    set
    {
        var init = _age;

        //You still need to change the _age to the value
        _age = value;

        this.CheckPropertyChanged<int>("Age", ref init, ref value);
    }
}
0 голосов
/ 13 августа 2010

Предполагая, что ваше представление привязано к возрасту в классе Model, Model должно реализовать INotifyPropertyChanged, и всякий раз, когда возраст изменяется, вы должны вызывать событие PropertyChanged.

...