【问题标题】:Windows Phone 8, use DependencyProperty for a usercontrol, PropertyChangedCallback and CoerceValueCallback issueWindows Phone 8,将 DependencyProperty 用于用户控件、PropertyChangedCallback 和 CoerceValueCallback 问题
【发布时间】:2013-12-22 04:02:59
【问题描述】:

我正在开发一个 windows phone 8 应用程序。我在我的用户控件中使用DependencyProperty。我发现PropertyMetadata的构造函数中的PropertyChangedCallback只有在属性值改变时才会触发。我有这个问题。

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 时如何调用函数吗?非常感谢

【问题讨论】:

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


    【解决方案1】:

    假设 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多