为notiyfing创建下面的类:
public abstract class Notifier : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
protected T Get<T>([CallerMemberName] string name = null)
{
Debug.Assert(name != null, "name != null");
object value = null;
if (_properties.TryGetValue(name, out value))
return value == null ? default(T) : (T)value;
return default(T);
}
protected void Set<T>(T value, [CallerMemberName] string name = null)
{
Debug.Assert(name != null, "name != null");
if (Equals(value, Get<T>(name)))
return;
_properties[name] = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public void Notify<T>(Expression<Func<T>> memberExpression)
{
if (memberExpression == null)
{
throw new ArgumentNullException("memberExpression");
}
var body = memberExpression.Body as MemberExpression;
if (body == null)
{
throw new ArgumentException("Lambda must return a property.");
}
var vmExpression = body.Expression as ConstantExpression;
if (vmExpression != null)
{
LambdaExpression lambda = Expression.Lambda(vmExpression);
Delegate vmFunc = lambda.Compile();
object sender = vmFunc.DynamicInvoke();
PropertyChanged?.Invoke(sender, new PropertyChangedEventArgs(body.Member.Name));
}
}
}
您的视图模型应该是这个样子。
public class ViewModel : Notifier
{
public ObservableCollection<String> Messages
{
get { return Get<ObservableCollection<String>>(); }
set
{
Set(value);
Notify(() => AreThereMessages);
}
}
public bool AreThereMessages => Messages?.Count > 0;
}
上面的Notifier类不需要任何私有变量。
吸气剂:get { return Get<T>(); }
设置器:get { Set(value); }
通知其他属性:Notify(() => OtherProperty);
实施例视图:
<DataGrid ItemsSource="{Binding Messages}"/>
<Button IsEnabled="{Binding AreThereMessages}"/>
上述代码通知按钮,如果消息集合为空或不。 这是我知道处理你的viewmodel没有额外的库最简单的方法。
您是否遇到过INotifyPropertyChanged? –
是的。两个问题。比事件表现更好吗?将属性通知放入Car类(它是一个业务对象,并且通知属性已更改是一个UI特定的想法)吗? – Jimmy
我相信是的。还有,它是非常正常的把属性通知放在你的模型类中,比如Car。这些事件是从您的模型属性的setter中引发的。你也可以从你的ViewModel接收通知,但是如果你要在你的UI上绑定这些通知,那么让你的属性设置器中的通知非常重要 –