【发布时间】:2011-06-26 18:28:13
【问题描述】:
我使用了Multibinding绑定了一些属性,并使用了INotifyPropertyChanged接口来通知这些属性的更改。但是很遗憾,INotifyPropertyChanged似乎不起作用。 PropertyChangedEventHandler“PropertyChanged”一直为空。
问题:
A.你能告诉我为什么事件为空吗?在我看来,事件PropertyChangedEventHandler应该有一个默认方法,我错了吗?(已解决,谢谢!)
B.就像一些朋友说的,我没有使用INotifyPropertyChanged再次尝试。但是目标的属性值似乎没有改变......
-
属性
public static readonly DependencyProperty LeftOffsetProperty = DependencyProperty.Register("LeftOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender)); public static readonly DependencyProperty TopOffsetProperty = DependencyProperty.Register("TopOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender)); public double LeftOffset { get { return (double)GetValue(LeftOffsetProperty); } set { SetValue(LeftOffsetProperty, value); } } public double TopOffset { get { return (double)GetValue(TopOffsetProperty); } set { SetValue(TopOffsetProperty, value); } } -
多重绑定(看起来效果不错。通过使用转换器计算受“TopOffset”和“LeftOffset”影响的位置)
var multibinding = new MultiBinding() { Converter = new BeginAndStartDateToLeftConverter_NetworkTaskLable(), ConverterParameter = NetworkView }; multibinding.Bindings.Add(new Binding("Start")); multibinding.Bindings.Add(new Binding("StartDate") { Source = NetworkView }); multibinding.Bindings.Add(new Binding("LeftOffset") { Source = this }); MainCanvas.SetBinding(LeftProperty, multibinding); -
INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged; public void CallPropertyChanged(string PropertyName) { if (PropertyChanged != null)//It seems to be null all the time!!!And the properties'changes were never notified!!! PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); } -
通知更改
SetValue(LeftOffsetProperty, moveAdorner.LeftOffset); CallPropertyChanged("LeftOffset"); SetValue(TopOffsetProperty, moveAdorner.TopOffset); CallPropertyChanged("TopOffset");
【问题讨论】:
-
你有依赖属性,但是这个接口是通过setter中的函数调用应用到公共属性的。
-
谢谢你,vorrtex。但原因可能不像你说的那样。我试图通知一个公共财产,事件仍然为空......
-
Vorrtex 意味着在您的情况下,绑定引擎侦听在 WPF 内部实现的依赖项属性更改。所以没有针对 PropertyChanged 的处理程序。
-
我会尽量解释清楚。从代码更新 UI 有两种互斥方式:1)使用 DependencyProperties; 2) 使用具有已实现 INotifyPropertyChanged 的公共属性。您选择了第一种方式,因此您可以从您的类中删除 PropertyChanged 事件和相关函数。
标签: c# .net wpf binding inotifypropertychanged