【发布时间】:2013-06-12 23:18:27
【问题描述】:
目标:
我有一个 WPF/MVVM(确切地说是 mvvm-light)应用程序,我想在其中识别/捕获整个 datagid 的 lostfocus 事件并将其绑定到视图模型中的 ICommand。
问题是每次数据网格中的控件失去焦点以及数据网格本身失去焦点时都会触发丢失焦点事件。在我的应用程序中,如果 viewModle“HasErrors”属性为真,如果用户尝试“导航”离开当前视图,我会在 datagrid lostfocus 事件/命令上抛出警告(MVVM 类型消息框)。结果是即使用户在数据网格中的控件之间移动,用户也会收到此错误/警告。我只在整个数据网格失去焦点时才想要它。
是什么让这变得困难: 简而言之,使这变得困难的是使用 MVVM。通常你可以在 lostfocus 事件后面的代码中检查 FocusManager 来获取当前聚焦的元素并查看它是否在数据网格中 (As outlined here)。
问题:
这个问题有 MVVM 标准解决方案吗?我不是那么盲目地死去 MVVM 永远不会有代码,我想我只是想知道这是不是其中一个时代,或者是否有一些我没有考虑过的策略选项,这很可能。
我尝试了什么:
FIRST- 我尝试为不同的命令设置不同的命令参数。即:
<DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cmd:EventToCommand Command="{Binding DataContext.PreNavigateValidateCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
CommandParameter="DataGridLostFocus"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
对于数据网格中的控件
<DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cmd:EventToCommand Command="{Binding DataContext.LostFocusValidateCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
CommandParameter="ControlostFocus"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
注意DataGridLostFocus 和ControlLostFocus 命令参数的不同。但是发生的情况是这些命令只发生了两次,每个命令参数一个,首先发生控制 lostfocus,然后是 datadrid lostfocus。
SECOND- 您会注意到不同的命令属性/名称。即使将命令绑定到不同的命令对象也不能解决这个问题。这两个命令都将按照上述相同的顺序被调用。
THIRD 数据网格在网格内,在扩展器内,在用户控件内。我尝试将 ICommand triggerbinding 向上移动到视觉树到这三个元素。即使放置在这三个“父”对象中的任何一个上,失去焦点事件也会以相同的方式触发。
我开始认为我需要找到另一个可行的事件,或者完全重新考虑如何处理视图模型的 HasErrors 属性的这个错误触发器。
如果能帮助我将整个数据网格的失去焦点事件隔离开来,仍然遵循 MVVM 标准,我将不胜感激。
谢谢
【问题讨论】:
标签: .net wpf mvvm datagrid mvvm-light