代码隐藏中的数据绑定

我想在类实例和两个WPF文本框之间设置绑定。 尽管如此,文本框并没有改变它们的状态,我无法弄清楚我做错了什么。

XAML

 Testing System      

MainWindow.xaml.cs

 private ADSbinding myADS = new ADSbinding(); private void clickBinding(object sender, RoutedEventArgs e) { Binding b1, b2; b1 = new Binding(); b2 = new Binding(); b1.Source = myADS.DeviceConfigured; b2.Source = myADS.ProcessingData; b1.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; b2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1); BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2); } private void clickChangeBinding(object sender, RoutedEventArgs e) { myADS.changedata(); } 

类:

 public class ADSbinding : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string deviceConfigured = "false"; private string processingData = "false"; public ADSbinding() { ProcessingData = "true"; } // Get-Set methods public string DeviceConfigured { get { return deviceConfigured; } set { deviceConfigured = value; Changed("DeviceConfigured"); } } public string ProcessingData { get { return processingData; } set { processingData = value; Changed("ProcessingData"); } } private void Changed(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public void changedata() { DeviceConfigured = "change"; ProcessingData = "change"; } } 

当按下“clickBinding”时状态发生变化,当“clickChangeBinding”保持不变时,再次点击“clickBinding”它会改变。 这是一个非常直接的尝试,我无法弄清问题在哪里。 任何人?

创建绑定时,将Source设置为对象的属性,而不是对象本身。 您应该在Binding构造函数中指定属性名称,然后将源设置为您的对象:

  b1 = new Binding("DeviceConfigured"); b2 = new Binding("ProcessingData"); b1.Source = myADS; b2.Source = myADS; 

除了bde答案,您还可以使用扩展方法,该方法允许您直接在FrameworkElement上设置绑定

 public static void SetBinding(this FrameworkElement target, DependencyProperty property, TargetType source, Expression> property_accessor) { var binding = new Binding(source.PropertyName(property_accessor)); binding.Source = source; target.SetBinding(property, binding); } public static string PropertyName(this TargetType obj, Expression property_accessor) { return ((MemberExpression)property_accessor.Body).Member.Name; } 

而不是打字

  BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1); BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2); 

你可以使用上面定义的扩展方法SetBinding

 txt1.SetBinding(TextBlock.TextProperty, myADS, x => x.DeviceConfigured); txt2.SetBinding(TextBlock.TextProperty, myADS, x => x.ProcessingData); 

这样您就可以避免将属性的名称作为字符串传递。