【发布时间】: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 的当前状态传递给我的命令?目前,我使用的是 MultiBinding 和 IMultiValueConverter,它只允许传递 object[]。
【问题讨论】: