uwp:以编程方式进行数据绑定问题

Posted

技术标签:

【中文标题】uwp:以编程方式进行数据绑定问题【英文标题】:uwp: data binding programmatically issue 【发布时间】:2021-03-14 19:02:37 【问题描述】:

我正在使用 uwp 进行开发,但我遇到了数据绑定问题。我有一个 listView,我填充了一个名为 PlaylistLeftOption 类的自定义面板元素。此类继承 Panel 类属性,继承 FrameworkElement 类属性及其方法,因此我有一个可用的 SetBinding 方法。 现在我正在尝试绑定高度值(它等于其他元素),所以我在其他外部单例类中创建了一个名为 PerformanceItemHeight 的静态属性。 因为我需要动态填充列表视图,所以我试图在构造函数中绑定值,但它不起作用。 这是构造函数中的代码:

    public PlaylistLeftOption()
    
        mainGrid.Background = new SolidColorBrush(Colors.Red);
        mainGrid.BorderBrush = new SolidColorBrush(Colors.Black);
        mainGrid.BorderThickness = new Thickness(0.5,0.25,0.5,0.25);

        WidthVal = 200;
        HeightVal = 50;

        var myBinding = new Binding();
        myBinding.Source = PerformanceLayout.Instance.PerformanceItemHeight;
        myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        myBinding.Mode = BindingMode.TwoWay;
        SetBinding(HeightValProperty, myBinding);

        Children.Add(mainGrid);
    

这是属性:

     public static readonly DependencyProperty HeightValProperty = DependencyProperty.Register(
      "HeightVal",
      typeof(double),
      typeof(PlaylistLeftOption),
      new PropertyMetadata(50)
    );

    public double HeightVal
    
        get => (double)GetValue(HeightValProperty);
        set
        
            SetValue(HeightValProperty, value);
            Height = HeightVal;
            mainGrid.Height = HeightVal;
            globalSize.Height = HeightVal;
        
    

这是 PerformanceItemHeight 的代码:

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    
        // Raise the PropertyChanged event, passing the name of the property whose value has changed.
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    

    private double _performanceItemHeight = 50;
    public double PerformanceItemHeight 
        get => _performanceItemHeight;
        set 
            _performanceItemHeight = value;
            this.OnPropertyChanged();
        
    

为什么通过 xaml 它可以工作? 我尝试通过 xaml 在列表视图中添加 PlaylistLeftOption 项目,没关系! 谢谢

【问题讨论】:

【参考方案1】:

通过测试,HeightVal 的绑定在 XAML 中有效,HeightVal 的绑定在代码隐藏中无效。您可以在文档 Custom dependency properties 的 实现包装器 部分中看到原因,该部分说您的包装器实现应该只执行 GetValue 和 SetValue 操作。否则,通过 XAML 设置属性与通过代码设置属性时,您将获得不同的行为。

您可以添加property-changed callback method来主动通知HeightVal的变化。

例如:

public static readonly DependencyProperty HeightValProperty = DependencyProperty.Register(
  "HeightVal",
  typeof(double),
  typeof(PlaylistLeftOption),
  new PropertyMetadata(100, new PropertyChangedCallback(OnHeightValChanged))
);
private static void OnHeightValChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

    PlaylistLeftOption playlistLeftOption = d as PlaylistLeftOption;
    if(playlistLeftOption != null)
    
        var height = (Double)e.NewValue;
        playlistLeftOption.HeightVal = height;
    

并像这样更改 binging 代码:

var myBinding = new Binding();
myBinding.Source = PerformanceLayout.Instance;
myBinding.Path = new PropertyPath("PerformanceItemHeight");
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myBinding.Mode = BindingMode.TwoWay;
SetBinding(HeightValProperty, myBinding);

【讨论】:

严谷非常感谢您!它工作正常! 如果答案已经解决了您的问题,请mark它被接受

以上是关于uwp:以编程方式进行数据绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

UWP Xaml文本块数据绑定 - 即使属性已更新,UI也不会更新

以编程方式添加到核心数据实体(如 IB 绑定“添加”)

android数据绑定:如何避免以编程方式触发的onCheckedChanged

以编程方式更改 GridView ItemTemplate 中的数据绑定属性

当我以编程方式更改用户控件时,如何让数据绑定双向工作?

UWP DependencyProperty 绑定和 DataTemplate 绑定