XAML BindableProperties如何在Xamarin.Forms中工作?

yvfmudvl  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(137)

我已经为我的项目创建了以下用户控件,并添加了一个可绑定属性,以便在我的视图中使用此用户控件的XAML期间访问此用户控件中ListView的ItemsSource属性。代码运行良好,主要是我知道这是如何工作的,但不详细:

namespace ShoppingTracker.UserControls
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ShoppingListScrollView : ContentView
    {
        public ShoppingListScrollView()
        {
            InitializeComponent();
        }
        
        // Property exposed by the control - to use in XAML file
        public ObservableCollection<ShoppingItem> ShoppingItemsDataSource { get; set; }
        //public ObservableCollection<ShoppingItem> ShoppingItemsDataSource { get; set; }

        // Create bindable property that is tracked by the Xamarin.Forms property system
        public static readonly BindableProperty ShoppingItemsDataSourceProperty = BindableProperty.Create(nameof(ShoppingItemsDataSource), typeof(ObservableCollection<ShoppingItem>), typeof(ShoppingListScrollView), null, BindingMode.TwoWay, null, ItemsSourcePropertyChanged);
        
        // Event that should get fired when data in the observable collection changes
        private static void ItemsSourcePropertyChanged(BindableObject bindable, object oldValue, object  newValue)
        {
            var control = (ShoppingListScrollView)bindable;
            control.ItemList.ItemsSource = (ObservableCollection<ShoppingItem>)newValue;

        }
    }
}

我理解的是:
公共属性ShoppingItemsDataSource由控件公开,并且可以通过XAML文件访问以分配ShoppingItem类型的ObservableCollection。
当ObserverableCollection中分配给ShoppingItemsDataSource的值更改时,将激发并执行ItemsSourcePropertyChanged事件。因此,如果值发生更改,则控件的ItemsSource将使用“更改的”ObservableCollection进行更新,并显示最新数据。
我不明白的是,在创建BindableProperty时,到底发生了什么。Create()-方法到底做了什么?这些BindableProperty到底在引擎盖下面做什么?我只知道,这个“特殊的”BindableProperty是由Xamarin.Forms属性系统跟踪的,因此跟踪对其源的更新,并且当我想使用数据绑定时,有必要创建访问用户控件中的控件属性。
也许有人可以详细解释这一点和整个过程是如何工作的,或者有一个很好的来源,我可以自己阅读或研究。我在谷歌上搜索了很多视频,但找不到一个令我满意的答案。
这就是我在stackoverflow上的第一个问题。
多谢了。

mjqavswn

mjqavswn1#

您的问题的范围有点大,超出了线程的范围。
但是你可以先从官方文档Bindable properties开始,这将有助于你理解和学习Bindable properties
可绑定属性的目的是提供一个属性系统,该系统支持通过父子关系设置的数据绑定、样式、模板和值。此外,可绑定属性可以提供默认值、属性值的验证以及监视属性更改的回调。
属性应实现为可绑定属性,以支持以下一个或多个功能:

  • 充当数据绑定的有效目标属性。
  • 通过样式设置属性。
  • 提供与属性类型的默认值不同的默认属性值。
  • 正在验证属性的值。
  • 监视属性更改。

Xamarin.Forms可绑定属性的示例包括Label.Text、Button.BorderRadius和StackLayout.Orientation。每个可绑定属性都有一个对应的public static readonly字段,其类型为BindableProperty,该字段在同一个类上公开,并且是可绑定属性的标识符。例如,Label.Text属性的对应可绑定属性标识符是Label.TextProperty
有关详细信息,请查看文档Xamarin.Forms Bindable Properties
上面的链接中有一个示例,您可以查看。

相关问题