忽略由于数据绑定而导致的文本/值更改

hap*_*rst 5 data-binding wpf

在数据绑定发生时,如何忽略对控件的更改?我尝试挂钩各种事件,如gotfocus,textchanged和leavefocus,但如果控件已经有焦点并且用户"取消"他们的更改,当我重新加载记录和数据绑定接管时,textchanged认为用户仍然进行了更改,因为重点是控制.调用堆栈为空.是否有任何全局数据绑定事件,如数据绑定启动和数据绑定结束?我看到我在哪里解雇我的OnProperyChanged但在该调用中,数据绑定不会发生.看起来它正在"排队"并在某个其他点运行.

有一次,我将在我们的视图模型中挂钩属性更改事件,但这意味着我将无法检测到并且无法显示窗体被修改,直到用户离开控件.我知道,我知道,我可以更改所有绑定,以便在每次更改字符时立即进行绑定,但由于用户尚未完成输入值,因此会出现一些验证情况.

我真的很喜欢像TextChangedByUser这样的事件,它会触发用户是否使用了键,剪贴板,鼠标剪贴板,以及用户触发的任何内容.

我只是无法弄清楚如何区分用户更改和数据绑定更改.

Mar*_*ser 6

我真的很喜欢像TextChangedByUser这样的事件,它会触发用户是否使用了键,剪贴板,鼠标剪贴板,以及用户触发的任何内容.

我只是无法弄清楚如何区分用户更改和数据绑定更改.

不要使用Text.TextChanged事件来检测用户输入,而是
使用Binding.SourceUpdated事件.

或者更一般:不要使用可视元素的DP来检测用户更新,Binding.SourceUpdated而是使用事件.

这是一个RoutedEvent.在绑定时,你必须设置NotifyOnSourceUpdated = true.在UpdateSourceTrigger您的帮助下,您甚至可以在想要获得通知时进行微调.


你的xaml可能是这样的:

<Grid x:Name="LayoutRoot" Binding.SourceUpdated="LayoutRoot_SourceUpdated">
    ...
    <TextBox>
        <TextBox.Text>
            <Binding NotifyOnSourceUpdated="True" Path="path" UpdateSourceTrigger="PropertyChanged" >
            </Binding>
        </TextBox.Text>
</Grid>
Run Code Online (Sandbox Code Playgroud)

你的活动可能是这样的:

private void LayoutRoot_SourceUpdated(object sender, DataTransferEventArgs e)
{
    // called every time s.th. changed by user
}
Run Code Online (Sandbox Code Playgroud)

(由于评论而编辑)
为什么这是检测用户是否以任何方式触发输入的有效方法?
在给定的示例中,TextBox的DataContext"path"属性是,而"TextBox.Text"属性是目标.
[数据绑定概述] http://msdn.microsoft.com/en-us/library/ms752347.aspx
TextBox.Text属性在绑定初始化并且source-value写入'TextBox时第一次更改.Text'财产.因为您不知道绑定何时发生,所以不能使用TextBox.Text属性或其任何事件(例如TextChanged)来检测用户输入.因此:不要使用Text.TextChanged事件来检测用户输入!更一般:不要使用视觉元素的DP来检测用户更新!

如果用户通过任何方式更改可视文本字段的内容,则"TextBox.Text"属性将更改(您的目标).之后,绑定将在定义的时间更新UpdateSourceTrigger.当SourceUpdated事件被触发时.

我承认不知道绑定外部对绑定源的更改的影响.但我有一个完整的类似编辑器的桌面应用程序,用户通过这种方式检测更改,并且工作得非常好.