【问题标题】:WPF User Control Losing FocusWPF 用户控制失去焦点
【发布时间】:2014-02-09 21:42:51
【问题描述】:

我有一个允许用户输入数据的 UserControl。我试图强制当焦点从用户控件中移除时,数据验证发生并且用户必须返回并更正数据或取消所做的更改。

我尝试过使用用户控件 LostFocus,但似乎每次用户在用户控件内的控件之间移动时都会调用它,而不仅仅是当用户控件失去焦点时。此外,似乎无法查看焦点移动到的位置并防止焦点丢失 - 即强制用户返回并纠正错误。

我来自 Winforms 背景,这很容易实现,但我在 WPF 中看不到任何简单的方法。

有人可以帮忙吗?

谢谢

附:示例代码(不起作用...)

private void UserControl_LostFocus(object sender, RoutedEventArgs e)
    {
        if (IsModified)
        {
            e.Handled = true;
            btnSave_Click(this, e);
        }

    }

只要用户控件内的控件失去焦点,就会调用上述方法。因此,如果用户控件有 3 个文本框,当用户在每个文本框之间移动时,每次都会调用此事件。如果焦点从用户控件本身移开,我只想处理该事件。然后我想提示用户“请在离开此页面之前保存或取消您的更改”。而且,只有当焦点移动到应用程序的另一部分时,而不是,例如,如果用户在应用程序之外使用 ALT-Tabbed。

【问题讨论】:

  • 不是我们必须在 WPF 中做的事情......或者无论如何都不要手动这样做。请查看 MSDN 上的Binding.UpdateSourceTrigger Property 页面。
  • 按照本网站的惯例,按照Help CenterHow do I ask a good question?页面上的描述,您可能会发现您会得到更多的答案。请添加一个simplified example of your code,它仍然可以清楚地表明您的问题。
  • 谢谢你,但我已经看过这个区域,它不适合我想要的,我对你的评论感到困惑“这不是我们在 WPF 中必须做的事情” .我想要做的并不罕见——数据只有在用户点击提交后才会提交。这不是问题。问题是如何防止用户在提交或取消更改之前离开控件。所以,据我所知,这与数据绑定无关,而是 UI 控制。
  • 您不必手动处理事件来启动 WPF 中的数据验证...如果操作正确则不会。请阅读 MSDN 博客上的 Data Validation in 3.5 页面以获得更多帮助...我会专注于页面中更有用的 IDataErrorInfo 部分,甚至可能还会查看 MSDN 上的 INotifyDataErrorInfo page
  • 再次感谢您的评论。我已经在整个应用程序中广泛使用了 IDataErrorInfo 和其他数据验证机制。这不是关于数据验证的问题或问题。我只是不希望用户在保存(在这种情况下数据库将被更新)或取消更改之前离开用户控件。请远离数据验证——这不是我要问的!数据已经过验证但未提交到数据库。我希望用户在移动到应用程序的另一个区域/屏幕之前必须单击保存或取消。

标签: wpf user-controls


【解决方案1】:

好的,我现在从您的 cmets 了解到,您只是想阻止用户在保存或取消当前编辑操作之前离开视图。为了将来参考,最好从你的总体目标开始你的问题......类似于上面的句子。 然后您继续说出您尝试过的内容...您当前拥有的问题文本。如果您这样做了,您的问题会立即得到回答。

那么我们怎样才能做到这一点呢?它实际上可能非常简单,但这取决于您更改视图的方式。当我的应用程序中的用户更改视图时,他们会单击ButtonButton 有一个相关的 Command 并且在视图模型的 ICommand 属性中,我加载了相关的视图。现在无论您使用Commands 还是用户想要更改视图时的事件都无关紧要。

此时可以控制应用程序。如果数据项尚未保存,或者编辑尚未取消,您可以简单地不加载视图。我假设如果它被取消,那么无论如何您都会加载不同的视图,因此您只需在加载请求的视图之前检查项目是否已保存。

如果您选择,您还可以在此阶段设置一个属性,以在 UI 中显示一条消息,用户必须在更改视图之前保存或取消该消息。这可以像在 UI 中将一开始为空的 string 数据绑定到 TextBlock 并在用户尝试加载另一个视图时将其设置为消息一样简单地完成。

【讨论】:

  • 谢谢,但这仍然不能阻止用户移动到另一个页面。这只是意味着他们正在编辑的事实被记录下来。
  • 怎么不呢?我说此时您可以控制应用程序。如果数据项尚未保存,或者编辑尚未取消,您可以简单地不加载视图...不加载新视图如何阻止用户更改视图或页面?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多