繁体   English   中英

有关WPF命令的问题

[英]Questions regarding WPF commands

我对WPF命令有一些疑问。

  1. 我应该在哪里放置确认对话框? 我应该在命令回调函数中显示它们吗? 如果在应用程序的某些区域中我不希望命令显示确认怎么办?

  2. 如果我有一个显示可以删除的项目的用户控件。 该命令应该在应用程序的视图模型中,还是将其用于项目删除,还是用户控件本身也应具有一个依次调用视图模型功能的命令? (注意:应用程序视图模型是唯一具有执行此操作所需信息的模型)

  3. 如何在命令中传递数据? 我主要使用DelegateCommand ,并在为网格项触发命令时,我想传递选定的项,否则应用程序的主视图模型将必须找到网格并找出其选择,这会将命令硬编码到网格并使其不可重用。

这有点意见和风格。 这是我的方法:

问题1:

我有一个处理任何确认的实用程序类,并且在MVVM Light中使用轻量级消息传递来处理视图,确认和viewmodel之间的通信。

编辑:关于点1的更多信息

在我的Command中,我将沿着“ ConfirmDeletionMessage”行发送一条消息,然后由我的对话框实用程序类接收该消息。 对话框实用程序类向用户显示适当的消息,并检查结果。 根据结果​​,它将广播“ DeletionConfirmedMessage”或“ DeletionCanceledMessage”,然后由ViewModel处理,以完成或取消删除。

如果您有多个订阅者,则存在一定的风险,因为您不知道将按照什么顺序处理消息,但是如果您对消息使用者有严格的管理,或者确保他们可以在消息使用者中运行随机顺序,这种方法效果很好,并且以可测试的方式将您的View和Model代码分开。

问题2:

这是一个艰难的过程,它将取决于您的整体应用程序。 我个人是将其放入项目的视图模型的爱好者。 这样,您不必担心第三个问题。 相反,删除操作仅适用于您要处理的项目。 但是 ,如果您必须对列表项之外的数据进行操作(例如将其从列表中删除),则将命令放在父viewmodel上更为有意义。

问题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);
}

然后您将适当实施。

我应该在哪里放置确认对话框? 我应该在命令回调函数中显示它们吗? 如果在应用程序的某些区域中我不希望命令显示确认怎么办?

确认对话框和显示消息对话框是视图。 您的VM应该有一种通知您的视图的方式,即它想要显示或询问某些内容,然后该视图应决定如何显示它(状态栏,窗口,弹出窗口,语音消息等)。

如果我有一个显示可以删除的项目的用户控件。 该命令应该在应用程序的视图模型中,还是将其用于项目删除,还是用户控件本身也应具有一个依次调用视图模型功能的命令? (注意:应用程序视图模型是唯一具有执行此操作所需信息的模型)

项目控件应引发一个删除命令。 VM应该处理命令并决定要执行的操作(VM应该具有所选项目的列表,并且视图应绑定到该列表)。

如何在命令中传递数据? 我主要使用DelegateCommand,并且在为网格项目触发命令后,我想传递选定的项目,否则应用程序的主视图模型将必须找到网格并找出其选择,这会将命令硬编码到网格并使其不可重用。

命令可以具有参数(例如RoutedUICommand)。 命令绑定可以为参数指定绑定表达式。 但是,正确的方法是让VM成为选择的源,并在视图的选择和VM之间进行双向绑定。

  1. 只需在您的视图模型中使用一个dialogservice
  2. 它取决于但仍然可以通过RelativeSource绑定轻松到达命令所在的对象/视图模型
  3. CommandParameter是一种方法。 实际上,您使用mvvm应该将所需的所有信息绑定到您的viewmodel。 因此,如果您有命令,并且需要列表视图中的selecteditem,则可以将其绑定到视图模型,而无需将其设置为commandparameter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM