代码之家  ›  专栏  ›  技术社区  ›  RezaNoei

使用ComboBox时出现绑定问题。所选项目

  •  0
  • RezaNoei  · 技术社区  · 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(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);
        }
    }
    

    我够不着 玩家数量 的二传手。这就是我的问题 结合 .

    我可以用 x:Bind 当然,但我所有的 UserControls 正在使用 结合 除了这个(我没有 组合框 在它们的其余部分上)。

    0 回复  |  直到 1 年前
        1
  •  0
  •   Clemens    1 年前

    如中所述 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);
    }