我正在开发一款Windows Phone 8应用程序。我在UserControl中使用DependencyProperty
。我发现PropertyChangedCallback
的构造函数中的PropertyMetadata
仅在属性值更改时触发。我有这个问题。
public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
"IsSelected", typeof(bool),
typeof(WCCSelectableButtonImageText),
new PropertyMetadata(
false,
new PropertyChangedCallback(IsSelectedPropertyChanged))
);
在我的代码中,我有一个属性IsSelected
,我想在设置值时执行某些操作,无论值是默认值还是已更改。但根据this,我们知道在包装器的集合定义中我们无法做任何事情。我也找到this,我确信无论属性是默认值还是已更改,都会调用CoerceValueCallback
。但是在windows phone SDK中,我发现我无法使用CoerceValueCallback
。将值设置为DependencyProperty
时,是否有人知道如何调用函数?非常感谢你
答案 0 :(得分:4)
假设IsSelectedPropertyChanged符合
protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
问题是因为这个方法是静态的,所以它无法访问类中的变量。由于与DependencyProperty相关的实际属性(变量)本身不是静态的,因此静态属性更改处理程序不知道特定于实例的属性/变量。
即。 IsSelected是一个实例属性,但DependencyProperty IsSelectedProperty是静态的,其值更改回调也是静态的。
public bool IsSelected
{
get{(bool)GetValue(IsSelectedProperty)}
set{SetValue(IsSelectedProperty, value)}
}
public static readonly DependencyProperty IsSelectedProperty =
DependencyProperty.Register("IsSelected", typeof(bool), type(thisCustomControlClassName), new PropertyMetadata(false, thisCustomControlClassName.IsSelectedPropertyChanged);
protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
所以你不能做到以下几点:
protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
IsSelected = true; //(IsSelected (instance properties) not available in the body of a static method)
}
解决方案是将DependencyObject参数转换为类的实例,然后您可以访问其所有实例属性和方法。
DependencyPropertyChangedEventArgs将在状态更改之前包含IsSelectedProperty的值
e.OldValue
和
中IsSelectedProperty的新值e.NewValue
其中e.NewValue和e.OldValue属于object类型,需要将其转换为您期望的类型(本示例中为bool)。
即
protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var control = (thisCustomControlClassName)o;
control.IsSelected = (bool)e.NewValue;
}