【问题标题】:Return a value from a command?从命令返回值?
【发布时间】:2014-07-11 15:05:56
【问题描述】:

我正在尝试在我的 WPF 应用程序中实现 MVVM 架构,并且我希望能够在执行命令后修改模型。请注意,我没有使用任何类型的 MVVM 框架。

我有一个基本的 Command 类,如下所示:

namespace MyApplication.Commands {
    public abstract class CommandBase : ICommand {
        protected static BackgroundWorker Worker = new BackgroundWorker();
        protected static string _result;

        public string Result {
            get {
                return _result;
            }
            set {
                _result = value;
            }
        }

        public abstract void DoWork(DoWorkEventArgs args);

        public virtual void Execute(object parameter) {
            Worker = new BackgroundWorker();

            Worker.DoWork += (o, args) => DoWork(args);
            Worker.RunWorkerCompleted += (sender, args) => {
                RaiseCanExecuteChanged(EventArgs.Empty);
            };
            Worker.ProgressChanged += (sender, args) => {
                RaiseCanExecuteChanged(EventArgs.Empty);
            };

            Worker.WorkerReportsProgress = true;

            Worker.RunWorkerAsync(parameter);
        }

        public virtual bool CanExecute(object parameter) {
            return !Worker.IsBusy;
        }

        public event EventHandler CanExecuteChanged;

        protected virtual void RaiseCanExecuteChanged(EventArgs e) {
            CanExecuteChanged(this, e);
        }
    }
}

我有实现这个的实际命令,如下:

namespace MyApplication.Commands {
    internal class DoSomethingCommand : CommandBase {

        public override void DoWork(DoWorkEventArgs args) {
            Worker.ReportProgress(0);
            var success = false;
            try {
                var parameter = args.Argument as int?;

                success = DoSomething(parameter);
            } finally {
                args.Result = success;
            }
        }

        private static bool DoSomething(int parameter) {
            // Do something expensive here...
            System.Func func = (arg) => {
                Thread.Sleep(arg);
                return true;
            };

            // etc etc...

            var success = func.Invoke(parameter);
            return success;
        }
    }
}

我使用它来执行昂贵的操作,同时仍然保持 MVVM 模型。我必须在进度和完成事件中执行RaiseCanExecuteChanged,否则UI不会更新相应的按钮状态。

但是,现在我想修改正在访问的当前Model 的属性(在ListView 控件中选择的AKA),它作为ViewModel 的属性公开。如何在保持 MVVM 架构的同时做到这一点?

还有没有更好的方法将ViewModel 的当前状态传递给我的命令?目前,我使用的是 MultiBindingIMultiValueConverter,它只允许传递 object[]

【问题讨论】:

    标签: c# .net wpf xaml mvvm


    【解决方案1】:

    为什么不在命令的构造函数中传递对 viewModel 的引用并将其保存在本地字段中。这样,您应该能够使用其公开的方法和属性来操作整个 viewModel。

    关于你的第二个问题:

    还有没有更好的方法将 ViewModel 的当前状态传递给我的命令?

    您的命令应该在 viewModel 中实现,因此您不必提供 viewModel 的状态。如果不是这种情况,为什么不通过在控件的 CommandParameter 属性中传递 DataContext 来传递整个 viewModel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多