使用 ComboBox.SelectedItem 时出现绑定问题

问题描述 投票:0回答:1

我在

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
)。

c# xaml mvvm binding winui-3
1个回答
0
投票

自定义依赖属性 - 实现包装器中所述:

除了特殊情况外,您的包装器实现应该只执行 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.