2014-01-20 147 views
2

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

我试过用用户控件LostFocus,但是这似乎是每当用户在用户控件内部的控件之间移动时调用,而不是当用户控件失去焦点时。此外,看起来没有办法看到焦点转移到哪里,并防止失去焦点 - 即迫使用户回去并纠正事情。

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

有人可以帮忙吗?

谢谢

P.S.示例代码(不起作用...)

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

    } 

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

+0

这是*不是*我们必须在WPF中做的事情......或者不是像那样手动操作。请查看['Binding.UpdateSourceTrigger'属性](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger(v = vs.110).aspx) MSDN上的页面。 – Sheridan

+0

按照本网站的惯例,如果您按照[我如何提出一个好问题?](http://stackoverflow.com/help/how-to-ask)上的描述,可能会发现您会得到更多答案。 [帮助中心]页面(http://stackoverflow.com/help)。请添加一个[简单的代码示例](http://stackoverflow.com/help/mcve),它仍然清楚地显示了您的问题。 – Sheridan

+0

感谢你们,但我已经看过这个领域,它不适合我想要的东西,我对你的评论感到困惑,“这不是我们在WPF中所做的事情”。我想要做的事情并不少见 - 只有在用户点击提交后才会提交数据。这不是问题。问题在于如何防止用户在提交或取消更改之前离开控制台。所以,尽我所能,看到这与数据绑定无关,而是UI控制。 –

回答

-1

好的,所以我现在从你的意见中了解到,你只是想在用户保存或取消当前编辑操作之前阻止用户离开视图。为了将来的参考,总是最好从总体目标开始提问......就像上面的句子一样。 然后你继续说出你试过的东西......你现在有的问题文本。如果你这样做了,你的问题将立即得到解答。

那么我们该如何实现呢?这真的很简单,但这取决于你改变视图的方式。当我的应用程序中的用户更改视图时,他们点击Button。那Button有一个相关的Command和视图模型中的ICommand属性,我加载相关的视图。现在,无论您使用Command s还是事件,当用户想要更改视图都无关紧要时。

这是在应用程序中有控制权。如果数据项目尚未保存,或者编辑未被取消,则无法加载视图。我假设,如果它被取消了,那么你会加载一个不同的视图,所以你只需要检查在加载所请求的视图之前该项目是否已被保存。

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

+0

谢谢,但这仍然不能阻止用户移动到另一个页面。这意味着他们正在编辑的事实被记录下来。 –

+0

它不怎么样?我说*这是在你的应用程序控制权。如果数据项没有被保存,或者编辑没有被取消,您可以简单地不加载视图* ...如何加载新视图*不*防止用户在您调用时更改视图或页面它? – Sheridan