问题描述
<Windowx:Class="WPF1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF1"mc:Ignorable="d"Title="MainWindow"UseLayoutRounding="True"Height="350"Width="525"><GridName="bb"><TextBoxx:Name="textBox"Text="{BindingElementName=textBox1,Path=Text,UpdateSourceTrigger=PropertyChanged}"/><TextBoxx:Name="textBox1"Text="{BindingElementName=textBox2,Path=Text,UpdateSourceTrigger=PropertyChanged}"TextChanged="textBox1_TextChanged"/><TextBoxx:Name="textBox2"TextChanged="textBox2_TextChanged"/></Grid></Window>
privatevoidtextBox1_TextChanged(objectsender,TextChangedEventArgse){MessageBox.Show("textBox1的值变");}privatevoidtextBox2_TextChanged(objectsender,TextChangedEventArgse){MessageBox.Show("textBox2的值变");}
在上面的代码中,textBox的Text绑定到textBox1的Text,textBox1的Text绑定到textBox2的Text。TextBox的Text默认都是双向绑定。textBox1和textBox2都注册了TextChanged事件。运行,当在textBox中输入内容后,会首先弹出"textBox2的值变",这就是我的问题所在:textBox的Text绑定到textBox1的Text,并且是双向的,那么textBox的Text更改之后,应该首先是textBox1的Text属性值变化啊,为什么变成了textBox2的Text首先变化呢?
解决方案
本帖最后由 df43r4t 于 2015-11-13 22:26:02 编辑
解决方案二:
没有人知道吗?
解决方案三:
TwoWay或OneWayToSource绑定侦听目标属性的更改,并将这些更改传播回源。这称为更新源。通常,只要目标属性进行了更改,就会进行这些更新。这对于复选框和其他简单控件很有用,但不适用于文本字段。每次键击之后进行更新都会降低性能,用户也得不到通常在提交新值之前使用退格键修改键入错误的机会。因此,Text属性的默认UpdateSourceTrigger值是LostFocus,而不是PropertyChanged。如果将UpdateSourceTrigger值设置为Explicit,则必须调用UpdateSource方法,否则所做的更改不会传播回源。我也是初学,说不出所以然,不过这样更好些;------<StackPanel><TextBoxx:Name="textBox"Width="100"TextChanged="textBox_TextChanged"/><TextBoxx:Name="textBox1"Width="100"Text="{BindingText,ElementName=textBox,Mode=TwoWay}"TextChanged="textBox_TextChanged"/><TextBoxx:Name="textBox2"Width="100"Text="{BindingText,ElementName=textBox1,Mode=TwoWay}"/></StackPanel>-----ints=1;privatevoidtextBox_TextChanged(objectsender,TextChangedEventArgse){MessageBox.Show(s+"");s=s+1;}
解决方案四:
谢谢楼上的回答,不过,我这里不想讨论UpdateSourceTrigger。我已经将UpdateSourceTrigger设置成了PropertyChanged
解决方案五:
别闹,你的代码都运行起来就一个textbox吧
解决方案六:
privatevoidtextBox_TextChanged(objectsender,TextChangedEventArgse){strings=((TextBox)sender).Name;MessageBox.Show(s+"Changed");}
解决方案七:
<StackPanel><TextBoxName="textBox1"Width="100"TextChanged="textBox_TextChanged"/><TextBoxName="textBox2"Width="100"Text="{BindingText,ElementName=textBox1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"TextChanged="textBox_TextChanged"/><TextBoxName="textBox3"Width="100"Text="{BindingText,ElementName=textBox2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"TextChanged="textBox_TextChanged"/></StackPanel>c#就是上面那个
解决方案八:
你好像直接修改邦定源了
解决方案九:
这不应该是个结论么