我正在通过一个项目学习MVVM,而我却陷入了一些简单的事情。
我有Button
更新ListView
。我在ViewModel中有一个command
可以做出正确的事情,但我想在我点击TextBox
后选择新行并将焦点放在Button
上。
问题是:如何在执行命令后更新我的UI?
如果我需要在操作完成后更改我的Windows标题,我在ViewModel上使用绑定到Window标题的属性,并在需要时更改但是,我不知道如何获得焦点在命令执行时的控件上。
谢谢。
答案 0 :(得分:2)
要选择新行,请向ViewModel添加新属性(例如“SelectedItem”),并将ListView的SelectedItem属性绑定到它:
<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">...
在ViewModel中,您只需将新项目分配给SelectedItem属性
为了集中TextBox,迈克的想法似乎很好
答案 1 :(得分:1)
您可以制作附加行为。我建议使用新的Blend行为框架,即包含此自定义逻辑的TriggerAction。
对于你的附加行为,你把它放在按钮上,给它一个IC为ICommand,也许是一个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。
答案 2 :(得分:0)
如何将焦点设置到后面代码中的控件:textBox.Focus() 我认为你在问题中提到的所有内容都是GUI逻辑,所以我会在按钮上添加一个Click事件来处理需要在GUI中发生的事情。
希望这有帮助。
答案 3 :(得分:0)
我认为您需要使用Mediator模式。请看这个:
Josh Smith's Mediator Prototype for WPF Apps
这通常用于与View-Model中的View进行通信。希望这会有所帮助。
答案 4 :(得分:0)
在您的情况下,您需要某种方式ViewModel通知View它应该将焦点设置在特定控件上。
这可以通过IView接口完成。视图实现此接口,ViewModel可以通过此接口调用View的方法。这样,您仍然可以将View和ViewModel相互分离。
如何做到这一点如下所示:
WPF应用框架(WAF)