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

7gyucuyw  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(153)

我在WinUI3中遇到了Binding的问题,我真的不明白问题的根源。
我在这个UserControl中定义了一个名为MyUserControlUserControl,我刚刚定义了一个名为NumberOfPlayersComboBox,如下所示:

<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(NumberOfPlayers),
        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)。

iibxawm4

iibxawm41#

如自定义依赖项属性-实现 Package 器中所述:
在所有情况下,除了例外情况,您的 Package 器实现应该只执行GetValue和SetValue操作。否则,通过XAML设置属性与通过代码设置属性时,您将获得不同的行为。为了提高效率,XAML解析器在设置依赖属性时会绕过 Package 器;并通过SetValue与后台存储对话。
因此,当依赖项属性由Binding设置时,框架不会调用 Package 器属性的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);
}

字符串

相关问题