2012-05-24 69 views
1

我有几个关于WPF命令的问题。关于WPF命令的问题

  1. 我应该在哪里放置确认对话框?我是否应该在命令回调函数内显示它们?如果在应用程序的某些区域我不想要命令显示确认呢?

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

  3. 如何在命令中传递数据?我主要使用DelegateCommand,并且在发射一个网格项目的命令时,我想要传递选定的项目,否则应用程序的主视图模型将不得不找到网格并找出它的选择,这会将命令硬编码为网格并不能重复使用。

+0

如果你有任何问题可以在未来各自独立,请分别询问每一个。所有三个问题似乎都不错(每个问题本身),因此我没有理由投票结束。 –

回答

2

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

问题1:

我有一个处理的任何确认一个工具类,我用的是轻量级的消息在MVVM光的观点,确认和视图模型之间处理通信。

编辑:于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); 
} 

,你会然后实施适当的。

+0

有趣。你能开一点你的观点1吗? – Tower

+0

更新了一些额外的评论。 – Robaticus

+0

为什么要为单用户同步确认对话框使用多用户异步消息调用?这几乎完全是该任务的错误解决方案。 –

2

我应该在哪里放置确认对话框?我是否应该在命令回调函数内显示它们?如果在应用程序的某些区域我不想要命令显示确认呢?

确认对话框和显示消息对话框是视图。 您的虚拟机应该有一种通知您的视图,它想要显示的东西或要求的东西,然后视图应该决定如何显示它(状态栏,窗口,弹出,语音消息,...)

如果我有一个显示可删除项目的用户控件。该命令是否应用于应用程序的视图模型中,并将其用于删除项目,或者用户控件本身是否也有一个命令,然后调用视图模型的函数? (注意:应用程序视图模型是唯一具有执行此操作所需信息的模型)

项目控件应引发删除命令。虚拟机应该处理命令并决定要做什么(虚拟机应该有选定项目的列表,并且视图应该绑定到该列表)。

如何在命令中传递数据?我使用的主要是DelegateCommand,并且在为网格项目发射一个命令时,我想要传递选定的项目,否则应用程序的主视图模型将不得不找到网格并找出它的选择,将该命令硬编码为网格并不能重复使用。

命令可以有参数(例如RoutedUICommand)。命令绑定可以为参数指定绑定表达式。然而,正确的方法是让VM通过视图选择和虚拟机之间的双向绑定成为选择的来源。

+0

这是什么票? –

+0

我删除了downvote,因为它确实没有保证。 – Robaticus

+0

@Robaticus关于你的编辑,例如应该在括号内,但是,该网站确实指出,您应该只进行重大编辑,以防止多次编辑导致将问题/答案标记为wiki的效果。 –

1
  1. 只需在您的视图模型
  2. 这取决于但尽管如此对象/视图模型,其中命令位于可以轻松的RelativeSource结合
  3. CommandParameter达到一个方式使用dialogservice。实际上你使用mvvm所有你需要的信息应该绑定到你的视图模型上。所以如果你有一个命令,并且你需要列表视图中的selecteditem,你可以将它绑定到视图模型,而不需要将其设置为命令参数