我已经为我的项目创建了以下用户控件,并添加了一个可绑定属性,以便在我的视图中使用此用户控件的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上的第一个问题。
多谢了。
1条答案
按热度按时间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。
上面的链接中有一个示例,您可以查看。