【问题标题】:WPF - Common event fired for value changedWPF - 因值更改而触发的公共事件
【发布时间】:2012-10-10 05:07:19
【问题描述】:

好的。这似乎是一个非常基本的用例,但由于某种原因,我在寻找跨控件类型的通用解决方案时遇到了问题。

以下是用例:

向用户呈现一个带有任何可编辑控件的表单。 (文本框、组合、网格等)。

用户在控件中编辑一个值并跳出。
期望我可以连接到诸如 Lost Focus 之类的事件并使用更改的值执行“foo”。

然后,用户将焦点返回到控件并退出而不进行编辑。 期望是无论我连接到什么事件,我都可以检查值是否已更改。

控件中是否有一个通用事件仅在用户完成编辑时触发(例如 tab out 或 enter )并允许我检查先前状态与当前状态?

【问题讨论】:

  • 你尝试过 LostFocus 和 KeyboardLostFocus 事件吗?
  • 如果您使用绑定,您可以在绑定对象本身上使用属性NotifyOnSourceUpdated(或目标)。另一个处理表单数据的好方法是BindingGroupsIEditableObject。但最好从 WPF 的基础开始。
  • 我能想到的唯一同时显示先前值和当前值的事件是 TextBoxTextChanged 事件。我强烈建议您将表单的DataContext 设置为实现INotifyPropertyChanged 的类,并将表单的控件绑定到该类的属性。这样,您可以处理代码中的任何更改逻辑,而不必尝试为它找出 XAML 事件。

标签: c# wpf events editing


【解决方案1】:

正如前面的答案所建议的,您最好实现一个视图 - 视图模型结构,您的视图模型已经实现了 INotifyPropertyChanged,从而允许您绑定到将向 UI 宣布其更改的属性。

如果您不想这样做,您最终可以在输入元素上订阅 PreviewKeyUp 事件,检查是否已按下 Tab 键并从那里继续。

【讨论】:

    【解决方案2】:

    您可能感兴趣的是实现 INotifyPropertyChanging(不仅仅是 INotifyPropertyChanged)。

    As noted in the answer of this question,INotifyPropertyChangING 不会阻止您更改值,而是检测何时发生更改以及新值将是什么。

    希望它对您的解决方案需求有所帮助。

    【讨论】:

      【解决方案3】:

      我想这可能是焦点问题。存在两种不同的焦点类型:键盘焦点和逻辑焦点。具有键盘焦点的控件是具有插入符号的控件,在用户按键的和输入的控件过程中。 a 控件可能具有逻辑焦点但没有键盘焦点。请在 MSDN 文章“输入概述”中检查这一点。关于另一个问题,也许您可​​以处理 TabControl.SelectedItemChanged 以在选项卡项选择更改时进行事件。 希望对您有所帮助...

      【讨论】:

        【解决方案4】:

        Jason,您可能希望查看 WPF 中的 Binding 和 DependencyProperties,而不是跟踪表单中的事件。您可以将一个类绑定到您的表单,该表单公开要更改的属性。使用 DependancyProperties 会触发一个名为“PropertyChanged”的事件。

        不幸的是,这是一个广泛的主题,但您将真正获得 WPF 编程模型的全部好处。搜索“wpf 中的依赖属性”会给你一些很好的例子。

        【讨论】:

          猜你喜欢
          • 2013-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 1970-01-01
          相关资源
          最近更新 更多