MVVM模式下,如何在命令执行后更新UI?

4

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

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

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

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

谢谢。

5个回答

2
为了选择新行,向ViewModel添加一个新属性(例如“SelectedItem”),并将ListView的SelectedItem属性绑定到它上面。
<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">...

在ViewModel中,您只需将新项目分配给SelectedItem属性即可。
要聚焦于TextBox,Mike的想法似乎不错。

1

你可以创建一个附加行为。我建议使用新的 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行为(在这里下载),它大约是你所需内容的一半。


0
那么在代码后台设置控件焦点怎么样呢:textBox.Focus()。我认为你在问题中提到的所有东西都是 GUI 逻辑,因此我会为按钮添加一个点击事件来处理需要在 GUI 中发生的事情。希望这可以帮助到你。

是的,我尝试过了,但如果您同时拥有命令和事件,两者都会被执行。事件将在命令之前执行(这就是我看到的)。我需要在命令执行其工作时设置焦点,因此需要在命令之后执行事件。如果我在按钮中删除命令并在事件内执行它,则会失去CanExecute功能,因为只有将命令附加到控件时才能使用CanExecute。 - Jesus Rodriguez
你需要从XAML中调用命令吗?难道你不能直接在Click事件中调用它吗?从数据上下文获取命令并在那里执行怎么样? - Fossmo
就像我说的那样,如果我从点击事件中调用命令,我会失去CanExecute的功能。 - Jesus Rodriguez

0

0
在您的情况下,您需要一种方法,使ViewModel通知View应该将焦点设置在特定控件上。
可以使用IView接口来完成此操作。视图实现此接口,ViewModel可以通过此接口调用View的方法。这样,您仍然可以将View和ViewModel解耦。
如何完成此操作的示例在此处显示:
WPF应用程序框架(WAF)

http://waf.codeplex.com


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接