我目前正在将一个项目迁移到PostSharp以删除大量的样板代码,其中大部分代码都非常顺利但我对如何强制命令重新检查CanExecute
感到困惑。我预计PostSharp将检查命令,就像检查依赖关系一样,这里是一个极简主义的样本
[NotifyPropertyChanged]
public class MyWindowViewModel
{
/// Anything bound to this refreshes just fine as expected
public ObservableCollection<SomeType> Documents = new ObservableCollection<SomeType>();
[Command]
public ICommand AddDocumentCommand { get; set; }
public void ExecuteAddDocument () { Documents.Add(new SomeType()); }
[Command]
public ICommand CloseDocumentCommand { get; set; }
public bool CanExecuteCloseDocument () => Documents.Any();
public void ExecuteCloseDocument () { Documents.Remove(Documents.Last()); }
}
开始时,集合为空,并且关闭命令附带的按钮按预期显示为灰色,但是通过附加到AddDocument
的按钮添加文档并不会激活关闭文档按钮,这是什么适当的方式来完成我需要的东西? PostSharp是仅将赋值而不是方法调用视为变更,还是完全不同于其他东西?
答案 0 :(得分:7)
根据他们的Command文档
CanExecuteCloseDocument
应该是属性
public bool CanExecuteCloseDocument => Documents.Any();
当命令需要参数
时,使用method选项依赖于输入参数的命令可用性检查可以作为方法实现。
例如
public bool CanExecuteCloseDocument (int blah) => Documents.Any();
public void ExecuteCloseDocument (int blah) { Documents.Remove(Documents.Last()); }
除此之外,主要问题是视图不知道要更新集合以了解刷新属性更改。
请参阅此http://www.postsharp.net/blog/post/Announcing-PostSharp-42-RC
对集合的依赖
将
[AggregateAllChanges]
属性添加到字段或 自动属性,对分配给的对象的属性的任何更改 此字段/属性将被解释为对此的更改 领域/财产本身。该属性现在仅适用于集合。
[NotifyPropertyChanged]
public class MyWindowViewModel {
/// Anything bound to this refreshes just fine as expected
[AggregateAllChanges] // <-- when the collection changes to cause notification
public ObservableCollection<SomeType> Documents { get; } = new ObservableCollection<SomeType>();
[Command]
public ICommand AddDocumentCommand { get; set; }
public void ExecuteAddDocument () { Documents.Add(new SomeType()); }
[Command]
public ICommand CloseDocumentCommand { get; set; }
public bool CanExecuteCloseDocument => Documents.Any();
public void ExecuteCloseDocument () { Documents.Remove(Documents.Last()); }
}