Windows Phone 8,将DependencyProperty用于usercontrol,PropertyChangedCallback和CoerceValueCallback问题

时间:2013-12-22 04:03:00

标签: c# windows-phone-8 user-controls dependency-properties

我正在开发一款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时,是否有人知道如何调用函数?非常感谢你

1 个答案:

答案 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;
}