这有点是意见和风格。. . 这是我的方法:
问题一:
我有一个处理任何确认的实用程序类,并且我使用 MVVM Light 中的轻量级消息来处理视图、确认和视图模型之间的通信。
编辑:关于第 1 点的更多信息
在我的命令中,我将按照“ConfirmDeletionMessage”的行发送一条消息,然后由我的对话实用程序类接收。对话实用程序类向用户显示适当的消息,并检查结果。根据结果,它将广播“DeletionConfirmedMessage”或“DeletionCanceledMessage”,然后由 ViewModel 处理以完成或取消删除。
如果您有多个订阅者订阅此消息,则会涉及一些风险,因为您不知道他们将被处理的顺序,但是如果您对消息消费者进行严格管理,或者确保他们能够在一个随机顺序,这种方法工作得很好,它以可测试的方式分离你的视图和模型代码。
问题2:
这是一项艰巨的任务,它将取决于您的整体应用程序。我个人很喜欢将它放在项目的视图模型中。这样,您就不必担心第三个问题。相反,删除操作仅适用于您正在处理的项目。 但是,如果您必须对列表项之外的数据进行操作(例如将其从列表中删除),则将命令放在父视图模型上会更有意义。
问题 3:
使用该CommandParameter
物业。你可以把它绑定到你想要的任何东西上。
编辑答案#2
马克格林(他在下面评论)让我思考。我最初对 WP7 采用了这种方法,它绝对适合我需要做的事情。但是,绝对应该考虑其他处理此问题的方法。另一个选项是您的视图模型可以使用的“确认类”。如果您使用的是 IoC 内核,则可以通过构造函数/属性注入轻松实现。或者,如果您有其他获取课程的方法,请这样做,但要以您可以在测试中模拟的方式进行。它可能看起来像这样:
public class ExampleViewmodel : ViewModel
{
private IConfirmDialogManager _dialogManager;
public ExampleViewmodel(IConfirmDialogManager dialog)
{
_dialogManager = dialog;
}
// ... code happens ...
private void DeleteCommand()
{
bool result = _dialogManager.Confirm("Are you sure you want to delete?");
}
}
使用如下所示的 IConfirmDialogManager 界面:
public interface IConfirmDialogManager
{
bool Confirm(string message);
}
然后您将适当地实施。