2

我正在使用 MVVM 模式在 WPF 中工作,并且通常情况看起来运行良好,因为我的大脑围绕着 WPF 和 MVVM 的细微差别。但是,我目前被困在一个特定的问题上。我的实际应用程序相当复杂,所以为了简化,让我们看一下 Josh Smith关于该模式的近乎定义的文章,并在其中使用该应用程序。

考虑图 2,并假设用户在名字和姓氏字段中输入了一些内容。然后,用户通过单击不同的客户选项卡或可能在同一应用程序中完全不同的视图模型,完全离开工作区(视图模型)。在这种情况下,我希望应用程序询问“嘿,你想保存你的更改吗?是/否/取消”并做出适当的回应。这带来了……挑战。

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

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

所以我希望我错过了一些重要的概念性的 a-ha,这将使这一切变得清晰。帮助?

4

1 回答 1

3

您需要专注于模型而不是视图。也就是说,应该触发您的逻辑的更改是什么在这种情况下,我会说这是尝试更改活动选项卡的时候。

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

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

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

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

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

  1. 当前标签是否脏?
  2. 如果是,请通过服务提示用户
  3. 如果用户取消,不要更改活动选项卡
  4. 如果用户保存或放弃更改,则更改活动选项卡

我认为您缺少的关键是总体视图模型。通过我的 ActiveAwareCommand 示例项目进行操作可能有助于增加您的理解。

于 2009-08-26T21:02:10.213 回答