【问题标题】:MVVM What is the way of updating a UI after a command?MVVM 命令后更新 UI 的方式是什么?
【发布时间】:2010-11-22 02:37:20
【问题描述】:

我正在通过一个项目学习 MVVM,但遇到了一些简单的问题。

我有一个Button,它更新了一个ListView。我在 ViewModel 中有一个 command 可以做正确的事情,但我想在单击 Button 后选择新行并将焦点放在 TextBox 上。

问题是:执行命令后如何更新 UI?

如果我需要在操作完成后更改我的窗口标题,我会使用绑定到窗口标题的 ViewModel 上的属性,并且在我需要它时会更改它,但是我不知道如何获得焦点执行命令时在控件上。

谢谢。

【问题讨论】:

    标签: wpf mvvm binding command


    【解决方案1】:

    如何在后面的代码中设置控件的焦点:textBox.Focus() 我认为您在问题中提到的所有内容都是 GUI 逻辑,因此我会向按钮添加一个 Click 事件来处理需要在 GUI 中发生的事情。

    希望这会有所帮助。

    【讨论】:

    • 是的,我试过了,但是如果你有命令和事件同时执行。事件将在命令之前执行(这就是我所看到的)。我需要在命令之后执行事件,因为我需要在命令执行其工作时设置焦点。如果我删除按钮中的命令并在事件中执行它,我会丢失 CanExecute 的东西,因为如果您将命令附加到控件,CanExecute 就可以工作。
    • 是否需要从 XAML 调用命令?你不能从 Click 事件中调用它吗?从数据上下文中获取命令并从那里执行?
    • 正如我所说,如果我从点击事件中调用命令,我会丢失 CanExecute 的东西。
    【解决方案2】:

    我认为您需要使用中介者模式。请看这个:

    Josh Smith's Mediator Prototype for WPF Apps

    这通常用于从 View-Model 与 View 进行通信。希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      要选择新行,向 ViewModel 添加一个新属性(例如“SelectedItem”),并将 ListView 的 SelectedItem 属性绑定到它:

      <ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">...
      

      在 ViewModel 中,您只需将新项目分配给 SelectedItem 属性

      要集中 TextBox,Mike 的想法似乎不错

      【讨论】:

        【解决方案4】:

        您可以进行附加行为。我建议使用新的 Blend 行为框架,即包含此自定义逻辑的 TriggerAction。

        对于您放在按钮上的附加行为,给它一个 ICommand 的 DP,也许是一个 ListView 类型的 DP。

        在 TriggerAction 的“protected override void Invoke(object parameter)”上,执行 ICommand,然后您就可以参考 ListView。在这里您可以对其进行自定义代码,例如设置焦点。

        您的 XAML 可能如下所示:

        <Button>
           <i:Interaction.Triggers>
              <i:EventTrigger EventName="Click">
                 <Behaviors:CustomBehavior Command="CommandName" ListView="{Binding ElementName=myListView}" />
              </i:EventTrigger>
           </i:Interaction.Triggers>
        <Button/>
        

        我建议查看 Mike Brown 的 ExecuteCommandAction 行为 (download here),它几乎是您需要的 1/2。

        【讨论】:

          【解决方案5】:

          在您的情况下,您需要某种方式让 ViewModel 通知 View 它应该将焦点设置在特定控件上。

          这可以通过 IView 界面来完成。视图实现了这个接口,ViewModel 可以通过这个接口调用视图的方法。这样,您仍然可以将 View 和 ViewModel 彼此分离。

          这里显示了如何做到这一点:

          WPF 应用程序框架 (WAF)

          http://waf.codeplex.com

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-26
            • 2014-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-28
            • 1970-01-01
            相关资源
            最近更新 更多