Обзор проекта
В основном я создавал приложение 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, вызывается, но данные не обновляются.