我在UWP应用中具有以下内容。请注意,我的元素从依赖项对象而不是从控件,面板等下降。但是,当我调用Test MestwithBindings()测试方法时,绑定不起作用。属性交换的方法确实会发射,但是属性ChangeDeventHandler为null,因此无能为力。我应该以某种方式直接设置活动处理程序吗?还是我想念的另一个电话会创建它?
顺便说一句,我有bindwidth/bindheight方法的框架版本,这些版本正常。
class WindowsElement: DependencyObject, INotifyPropertyChanged
{
public WindowsElement()
{
}
private double _Width { get; set; }
private double _Height { get; set; }
public double Width
{
get
{
return _Width;
}
set
{
if (_Width != value)
{
_Width = value;
OnPropertyChanged("Width");
}
}
}
public double Height
{
get
{
return _Height;
}
set
{
if (_Height != value)
{
_Height = value;
OnPropertyChanged("Height");
}
}
}
public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(
"Width",
typeof(double),
typeof(WindowsElement),
null);
public static readonly DependencyProperty HeightProperty = DependencyProperty.Register(
"Height",
typeof(double),
typeof(WindowsElement),
null);
private double _ActualWidth { get; set; }
public double ActualWidth {
get
{
return _ActualWidth;
}
set
{
if (_ActualWidth != value)
{
_ActualWidth = value;
OnPropertyChanged("ActualWidth");
}
}
}
private double _ActualHeight { get; set; }
public double ActualHeight {
get
{
return _ActualHeight;
}
set
{
if (_ActualHeight != value)
{
_ActualHeight = value;
OnPropertyChanged("ActualHeight");
}
}
}
public static readonly DependencyProperty ActualWidthProperty = DependencyProperty.Register(
"ActualWidth",
typeof(double),
typeof(WindowsElement),
null);
public static readonly DependencyProperty ActualHeightProperty = DependencyProperty.Register(
"ActualHeight",
typeof(double),
typeof(WindowsElement),
null);
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
internal void SetBinding(DependencyProperty property, Binding b)
{
BindingOperations.SetBinding(this, property, b);
}
public static void MessWithBindings()
{
WindowsElement we1 = new WindowsElement();
WindowsElement we2 = new WindowsElement();
we1.BindWidth(we2);
we1.BindHeight(we2);
we2.Width = 12;
we2.ActualWidth = 13;
we2.ActualHeight = 666;
CommonDebug.LogLine(we1, we1.Width, we1.Height, we1.ActualWidth, we1.ActualHeight, we2, we2.ActualWidth, we2.ActualHeight);
CommonDebug.DoNothing();
}
}
internal static class WindowsElementAdditions
{
public static void BindWidth(this WindowsElement bindMe, WindowsElement toMe)
{
Binding b = new Binding();
b.Mode = BindingMode.OneWay;
b.Source = toMe.ActualWidth;
bindMe.SetBinding(WindowsElement.WidthProperty, b);
}
public static void BindHeight(this WindowsElement bindMe, WindowsElement toMe)
{
Binding b = new Binding();
b.Mode = BindingMode.OneWay;
b.Source = toMe.ActualHeight;
bindMe.SetBinding(WindowsElement.HeightProperty, b);
}
}
依赖项属性的属性包装器必须调用依赖项的GetValue
和SetValue
方法,例如
class WindowsElement : DependencyObject
{
public static readonly DependencyProperty WidthProperty =
DependencyProperty.Register(
"Width", typeof(double), typeof(WindowsElement), null);
public double Width
{
get { return (double)GetValue(WidthProperty); }
set { SetValue(WidthProperty, value); }
}
}
,除此之外,它一定不能称呼其他任何东西。当该属性由绑定(或样式设置器,其他几个来源)设置时,该框架不调用属性包装器,而是直接调用SetValue
。
为了在内部通知属性值,该类应通过PropertyMetadata
注册PropertyChangedCallback
public static readonly DependencyProperty WidthProperty =
DependencyProperty.Register(
"Width", typeof(double), typeof(WindowsElement),
new PropertyMetadata((double)0, WidthPropertyChanged));
private static void WidthPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
WindowsElement element = (WindowsElement)o;
double width = (double)e.NewValue;
// update element here if necessary
}
依赖性属性已经实现了一种机制,该机制通知了侦听器(例如绑定)有关变化属性值的机制,因此无需在此处实现INotifyPropertyChanged
。