gpt4 book ai didi

c# - Windows Phone 8,将 DependencyProperty 用于用户控件、PropertyChangedCallback 和 CoerceValueCallback 问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:38:07 25 4
gpt4 key购买 nike

我正在开发 Windows Phone 8 应用程序。我在我的 UserControl 中使用 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 时如何调用函数吗?非常感谢

最佳答案

假设 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 是对象类型,需要转换为您期望的类型(本例中为 bool)。

protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var control = (thisCustomControlClassName)o;
control.IsSelected = (bool)e.NewValue;
}

关于c# - Windows Phone 8,将 DependencyProperty 用于用户控件、PropertyChangedCallback 和 CoerceValueCallback 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com