我在
Binding
中遇到了WinUI3
的问题,我不太明白问题的根源。
我在这个
UserControl
中定义了一个名为MyUserControl
的UserControl
,我刚刚定义了一个名为ComboBox
的NumberOfPlayers
,如下所示:
<ComboBox
Width="{Binding ElementName=numberOfPlayersStackPanel, Path=ActualWidth}"
ItemsSource="{Binding ElementName=myUserControl, Path=NumberOfPlayersCollection}"
SelectedItem="{Binding ElementName=myUserControl, Path=NumberOfPlayers, Mode=TwoWay}"/>
这是我的隐藏代码:
public ObservableCollection<int> NumberOfPlayersCollection { get; set; } = new ObservableCollection<int>() { 5, 6, 10 };
public static readonly DependencyProperty NumberOfPlayersProperty =
DependencyProperty.Register(
nameof(NumberOfPlayersProperty),
typeof(int),
typeof(MyUserControl),
new PropertyMetadata(5));
public int NumberOfPlayers
{
get => (int)GetValue(NumberOfPlayersProperty);
set
{
// I cant reach to this line.
SetValue(NumberOfPlayersProperty, value);
}
}
我无法联系到
NumberOfPlayers
的二传手。这就是我遇到的问题Binding
。
我当然可以用
x:Bind
来做,但我所有的 UserControls
都在用 Binding
工作,除了这个(我在其余的上没有 ComboBox
)。
如自定义依赖属性 - 实现包装器中所述:
除了特殊情况外,您的包装器实现应该只执行 GetValue 和 SetValue 操作。否则,当通过 XAML 设置属性时与通过代码设置属性时,您将获得不同的行为。 为了提高效率,XAML 解析器在设置依赖属性时绕过包装器;并通过 SetValue 与后备存储对话。
因此,当通过 Binding 设置依赖属性时,框架不会调用包装器属性的 setter,而是直接调用
SetValue
方法。为了获得有关依赖属性值更改的通知,您必须使用属性元数据注册 PropertyChanged
回调。
除此之外,您还为 Register 方法使用了错误的
name
参数。一定是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);
}