创建一个类名为 ObservableObject的类,其中的代码如下所示:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace Notepad_WPF.Helpers
{
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected PropertyChangedEventHandler PropertyChangedHandler => PropertyChanged;
public void VerifyPropertyName(string propertyName)
{
var myType = GetType();
if (!string.IsNullOrEmpty(propertyName) && myType.GetProperty(propertyName) == null)
{
var descriptor = this as ICustomTypeDescriptor;
if (descriptor != null)
{
if (descriptor.GetProperties().Cast().Any(property => property.Name == propertyName))
{
return;
}
}
throw new ArgumentException("Property not found", propertyName);
}
}
public virtual void RaisePropertyChanged(string propertyName)
{
VerifyPropertyName(propertyName);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public virtual void RaisePropertyChanged(Expression> propertyExpression)
{
if (PropertyChanged != null)
{
var propertyName = GetPropertyName(propertyExpression);
if (!string.IsNullOrEmpty(propertyName))
{
RaisePropertyChanged(propertyName);
}
}
}
protected static string GetPropertyName(Expression> propertyExpression)
{
if (propertyExpression == null)
{
throw new ArgumentNullException("propertyExpression");
}
var body = propertyExpression.Body as MemberExpression;
if (body == null)
{
throw new ArgumentException("Invalid argument", "propertyExpression");
}
var property = body.Member as PropertyInfo;
if (property == null)
{
throw new ArgumentException("Argument is not a property", "propertyExpression");
}
return property.Name;
}
protected bool Set(Expression> propertyExpression, ref T field, T newValue)
{
if (EqualityComparer.Default.Equals(field, newValue))
{
return false;
}
field = newValue;
RaisePropertyChanged(propertyExpression);
return true;
}
protected bool Set(string propertyName, ref T field, T newValue)
{
if (EqualityComparer.Default.Equals(field, newValue)) { return false; }
field = newValue;
RaisePropertyChanged(propertyName);
return true;
}
protected bool Set(ref T field,T newValue,[CallerMemberName] string propertyName = null)
{
return Set(propertyName, ref field, newValue);
}
}
}
可直接复制,使用方式如下所示:



