WPF:特定控件/视图/视图模型上的LostFocus事件

时间:2009-08-26 20:48:37

标签: wpf focus viewmodel lost-focus

我正在使用MVVM模式在WPF中工作,并且通常事情似乎工作得很好,因为我围绕着WPF和MVVM的细微差别。但是,我目前陷入了一个特定的问题。我的实际应用程序相当复杂,因此为了简化,我们将Josh Smith的near-defining article放在模式上并使用其中的应用程序。

考虑图2,并想象用户在名字和姓氏字段中输入了一些内容。然后,用户完全点击工作区(viewmodel),方法是单击不同的客户选项卡,或者可能是同一应用程序中完全不同的视图模型。在这种情况下,我想要发生的是应用程序询问“嘿,你想保存你的更改吗?是/否/取消”并做出适当的回应。这提出了......挑战。

因为我希望用户能够“取消”第一遍建议需要PreviewLostKeyboardFocus(因为我可以设置Handled = true并取消焦点移位)。但是,若干用户操作(例如单击其他工作区的选项卡)不会改变键盘焦点。 LostFocus在这方面更好地覆盖了我,但这只是在焦点已经丢失之后(当然我可以将其切换回来?)并且确定事件是否来自视图本身存在问题(即,我们要离开整个视图)或者它是否只是从一些包含的对象中冒出来的。

关于这一切的全局 - 这似乎是视图的一个问题,但那意味着在视图中编写代码而不是魔术视图模型。这让我觉得我没有正确看待这个。

所以我希望我能错过一些能让这一切清楚的大概念。帮助

1 个答案:

答案 0 :(得分:3)

你需要专注于你的模特而不是你的观点。也就是说,做什么改变应该触发你的逻辑?在这种情况下,我会说是在尝试更改活动标签时。

因此,您需要一个总体视图模型,其职责是:

  • 公开所有子视图模型的集合(每个模型都显示在自己的选项卡中)
  • 跟踪活动(选定)子视图模型(即活动选项卡)

您的视图将以通常的方式绑定到这些属性:

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/>

SelectedTab属性将按如下方式应用您的逻辑:

  1. 当前标签是否脏了?
  2. 如果是,请通过服务提示用户
  3. 如果用户取消,请不要更改活动标签
  4. 如果用户保存或放弃更改,请更改活动标签
  5. 我认为你缺少的关键是最重要的视图模型。通过my ActiveAwareCommand sample project工作可能有助于提高您的理解。