如中所述
Custom dependency properties - Implementing the wrapper
:
在除特殊情况外的所有情况下,包装器实现都应该只执行GetValue和SetValue操作。否则,通过XAML设置属性时与通过代码设置属性时会得到不同的行为。
为了提高效率,XAML解析器在设置依赖属性时会绕过包装器;并通过SetValue与后台存储进行对话。
因此,当依赖属性由Binding设置时,框架不会调用包装器属性的setter,而是直接调用
SetValue
方法为了获得有关依赖属性值更改的通知,您必须注册
PropertyChanged
具有属性元数据的回调。
除此之外,你还用错了
name
Register方法的参数。一定是
nameof(NumberOfPlayers)
不
nameof(NumberOfPlayersProperty)
.
public static readonly DependencyProperty NumberOfPlayersProperty =
DependencyProperty.Register(
nameof(NumberOfPlayers),
typeof(int),
typeof(MyUserControl),
new PropertyMetadata(5, NumberOfPlayersChanged));
public int NumberOfPlayers
{
get => (int)GetValue(NumberOfPlayersProperty);
set => SetValue(NumberOfPlayersProperty, value);
}
private static void NumberOfPlayersChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var control = (MyUserControl)obj;
var newValue = (int)args.NewValue;
Debug.WriteLine(newValue);
}