UI 在命令调用之前控制可见性?

UI Control Visibility Before Command Invocation?

我有一个发送多封电子邮件的按钮命令,因此需要几秒钟的时间来执行该方法。我想在执行此方法时显示进度环 Mahapps.Metro 并禁用视图。

这是我的 ProgressRing 在我看来:

 <Controls:ProgressRing IsActive="True" Visibility="{Binding IsProgressRingVisible, UpdateSourceTrigger=PropertyChanged}" />

ViewModel 属性:

  private Visibility _IsProgressRingVisible;
  public Visibility IsProgressRingVisible
   {
     get { return _IsProgressRingVisible; }
     set
      {
        _IsProgressRingVisible = value;
        OnPropertyChanged("IsProgressRingVisible");
      }
    }   

& 最后我的按钮命令逻辑:

 private void DisableView()
        {
            IsProgressRingVisible = Visibility.Visible;
            IsEditable = false;
        }

  private void ApprovePublicationCommandAction()
        {
            DisableView();

            try
            {              
                Send emails blah bah

显然,命令方法逻辑在通知 UI 并更改 ProgressRing 可见性之前运行。有什么方法可以显示 ProgressRing 然后继续执行命令逻辑?

你可以创建一个像 CommandIsExecuting 这样的 属性 并且你可以将这个 属性 绑定到命令的 whenExecuting Action。

下面是 AsyncRelayCommand 构造器的代码片段

readonly Func<T, Task> _asyncExecute;
        readonly Predicate<T> _canExecute;
        readonly Action<bool> _whenExecuting;
public AsyncRelayCommand(Func<T, Task> asyncExecute, Predicate<T> canExecute, Action<bool> whenExecuting)
        {
            if (asyncExecute == null)
                throw new ArgumentNullException("asyncExecute");

            _asyncExecute = asyncExecute;
            _canExecute = canExecute;
            _whenExecuting = whenExecuting;
        }

然后在执行命令的 ViewModel 中,您只需使用 whenExecuting 到本地 属性,如下所示

    private bool _commandIsExecuting;
    public virtual bool CommandIsExecuting
    {
        get
        { return _commandIsExecuting; }
        protected set
        {
            _commandIsExecuting = value;
            OnPropertyChanged(() => this.CommandIsExecuting);
        }
    }

MyCommand = new AsyncRelayCommand<object>(CommandImplementation, CanIExecute, (b) => CommandIsExecuting = b);

完成了我的方法 Async:

private async void ApprovePublicationCommandAction()
{
   DisableView();

   await Task.Factory.StartNew(() =>
    {
      try
       {
         Send emails blah blah

然后在工作完成后启用视图,前提是不抛出异常。感谢您的帮助。