我无法在 WPF 中实现双向绑定。
我的应用程序主窗口中有一个绑定到文本框的字符串属性(我将模式设置为“TwoWay”)。
TextBox 的值唯一更新的时间是窗口初始化时。
当我在文本框中键入内容时,基础字符串属性值不会更改。
当字符串属性的值被外部源更改(例如,Click 上的事件,仅重置 TextBox 的值)时,更改不会向上传播到 TextBox。
即使在这个几乎微不足道的示例中,我必须执行哪些步骤才能使双向绑定正常工作?
您很可能正在尝试绑定到 .net CLR 属性,而不是 WPF dependencyProperty(除了其他一些功能之外,它还提供更改通知)。
对于普通的 CLR 属性,您需要实现 INotifyPropertyChanged 并在 PropertyChanged 的事件处理程序中强制更新文本框。
- 因此,让具有属性的对象实现此接口,在属性设置器中引发事件。 (所以现在我们有属性变更通知)
- 确保该对象设置为 UI 元素/控件的 DataContext 属性
当我开始学习 WPF 数据绑定时,这也让我感到困惑。
Update: 好吧,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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)