我无法在WPF中获得双向绑定。
我的应用程序主窗口中有一个字符串属性绑定到TextBox(我将模式设置为“TwoWay”)。
TextBox的值将更新的唯一时间是窗口初始化时。
当我输入TextBox时,底层字符串属性值不会改变。
当外部源更改字符串属性的值时(例如,Click上的事件只会重置TextBox的值),更改不会传播到TextBox。
即使是这个几乎无足轻重的例子,我必须实现哪些步骤才能使双向绑定正常工作?
答案 0 :(得分:58)
很可能你正在尝试绑定到.net CLR属性而不是WPF dependencyProperty(除了其他一些东西之外还提供更改通知)。
对于普通的CLR属性,您需要在PropertyChanged的事件处理程序中实现INotifyPropertyChanged并强制更新文本框。
当我开始学习WPF数据绑定时,这也让我失望。
更新: 好吧OP,如果我在错误的树上咆哮,那将是浪费时间..反正现在因为你不得不挖一点......你会记住它很长一段时间。这是完成这个答案的代码片段。还发现,一旦我跳出选项,就会自动更新文本框。如果你的datacontext对象不是实现INotifyPropertyChanged的对象,你只需要手动订阅事件并更新UI。
MyWindow.xaml
<Window x:Class="DataBinding.MyWindow" ...
Title="MyWindow" Height="300" Width="300">
<StackPanel x:Name="TopLevelContainer">
<TextBox x:Name="txtValue" Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
<TextBlock TextWrapping="Wrap">We're twin blue boxes bound to the same property.</TextBlock>
<TextBox x:Name="txtValue2" Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
</StackPanel>
</Window>
MyWindow.xaml.cs
public partial class MyWindow : Window, INotifyPropertyChanged
{
public MyWindow()
{
InitializeComponent();
this.MyDotNetProperty = "Go ahead. Change my value.";
TopLevelContainer.DataContext = this;
}
private string m_sValue;
public string MyDotNetProperty
{
get { return m_sValue; }
set
{
m_sValue = value;
if (null != this.PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyDotNetProperty"));
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
答案 1 :(得分:5)
我觉得需要增加一些精度:
“双向”数据绑定不仅仅是“单向”数据绑定。
“单向”数据绑定是从源到依赖属性的绑定。源必须实现INotifyProertyChanged,以便从源到目标进行更改传播。
要获得“2路”,所以要从Target传播到Source,它取决于您在Binding上设置的绑定模式。如果没有为绑定设置任何BindingMode,将使用默认的绑定模式,并且此默认模式是目标依赖项属性的特征。
绑定到字符串属性的文本框,名为“MyTextProperty”。 在代码中,将Textbox.Text DependencyProperty绑定到对象“MyObject”上的“MyTextProperty”
- &GT; “单向”绑定:“My TextProperty”的setter必须引发一个Property Changed事件,而“MyObject”必须实现INotifyPropertyChanged。
- &GT; “2种方式数据绑定”:除了“单向”所需的内容之外,bindingMode必须设置为“2种方式”。在这种特殊情况下,Textbox的Text DependencyProperty确实有“2路”作为默认模式,所以没有别的事可做!
答案 2 :(得分:3)
我们可能需要查看代码。您的字符串属性是否引发了PropertyChanged事件?或者(甚至更好)它是作为DependencyProperty实现的?如果没有,绑定的TextBox将不知道值何时更改。
至于键入TextBox并且没有看到属性的值更改,这可能是因为TextBox没有失去焦点。默认情况下,绑定的TextBox不会将其值写回源属性,直到焦点离开控件。尝试跳出它并查看属性值是否发生变化。