我正在使用MVVM模式在WPF中工作,并且通常事情似乎工作得很好,因为我围绕着WPF和MVVM的细微差别。但是,我目前陷入了一个特定的问题。我的实际应用程序相当复杂,因此为了简化,我们将Josh Smith的near-defining article放在模式上并使用其中的应用程序。
考虑图2,并想象用户在名字和姓氏字段中输入了一些内容。然后,用户完全点击工作区(viewmodel),方法是单击不同的客户选项卡,或者可能是同一应用程序中完全不同的视图模型。在这种情况下,我想要发生的是应用程序询问“嘿,你想保存你的更改吗?是/否/取消”并做出适当的回应。这提出了......挑战。
因为我希望用户能够“取消”第一遍建议需要PreviewLostKeyboardFocus(因为我可以设置Handled = true并取消焦点移位)。但是,若干用户操作(例如单击其他工作区的选项卡)不会改变键盘焦点。 LostFocus在这方面更好地覆盖了我,但这只是在焦点已经丢失之后(当然我可以将其切换回来?)并且确定事件是否来自视图本身存在问题(即,我们要离开整个视图)或者它是否只是从一些包含的对象中冒出来的。
关于这一切的全局 - 这似乎是视图的一个问题,但那意味着在视图中编写代码而不是魔术视图模型。这让我觉得我没有正确看待这个。
所以我希望我能错过一些能让这一切清楚的大概念。帮助
答案 0 :(得分:3)
你需要专注于你的模特而不是你的观点。也就是说,做什么改变应该触发你的逻辑?在这种情况下,我会说是在尝试更改活动标签时。
因此,您需要一个总体视图模型,其职责是:
您的视图将以通常的方式绑定到这些属性:
<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/>
SelectedTab
属性将按如下方式应用您的逻辑:
我认为你缺少的关键是最重要的视图模型。通过my ActiveAwareCommand sample project工作可能有助于提高您的理解。