触发" CanExecute" on postharp [命令]当文档发生变化时?

时间:2017-07-11 05:19:36

标签: c# .net wpf postsharp

我目前正在将一个项目迁移到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是仅将赋值而不是方法调用视为变更,还是完全不同于其他东西?

1 个答案:

答案 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()); }        
}