为何将Shell.Items设为仅可读的可绑定属性?
Shell.Items 相关定义与疑问解答
核心定义
Shell.Items 属性
public System.Collections.Generic.IList<Microsoft.Maui.Controls.ShellItem> Items { get; }
Shell.ItemsProperty 字段
public static readonly Microsoft.Maui.Controls.BindableProperty ItemsProperty;
根据官方文档对可绑定属性的描述:
可绑定属性的作用是提供支持数据绑定的属性系统……
我的认知与问题
我对可绑定属性的基本认知是,声明为可绑定属性后,应该能在XAML中进行类似这样的绑定操作:
<CollectionView ItemsSource="{Binding ItemsSourceInViewModel}"> <Label Text="{Binding SomeTextProperty}" /> ...etc
但对于Shell.Items,我无法执行如下绑定操作:
<Shell Items="{Binding ShellItemsSource}">
我推测这是因为它是仅包含getter的只读属性,但既然如此,为何要将它设为可绑定属性呢?
解答
首先,你的推测是对的:Shell.Items是只读的可绑定属性,CLR包装器只有get访问器,因此无法直接通过数据绑定给它赋值(数据绑定赋值需要属性支持set,或配合可修改集合的变更通知)。
将它声明为可绑定属性的核心原因有两个:
支持集合变更通知
Shell.Items返回的IList<ShellItem>内部是实现了INotifyCollectionChanged的集合类型。注册为可绑定属性后,当集合内元素(如添加/删除FlyoutItem、TabBar)发生变化时,Shell能自动感知并同步更新UI(比如侧边栏导航项)。如果它只是普通CLR属性,Shell无法监听集合的动态变化。支持XAML声明式初始化
在XAML中直接嵌套ShellItem子类到<Shell>标签内的写法能生效,正是依赖于Items作为可绑定属性的特性:<Shell> <FlyoutItem Title="首页"> <Tab> <ShellContent ContentTemplate="{DataTemplate local:MainPage}" /> </Tab> </FlyoutItem> </Shell>XAML解析器能识别这个可绑定属性,自动将嵌套元素添加到
Items集合中,无需手动在后台代码调用Items.Add()。
简言之,Shell.Items作为可绑定属性的核心价值是支持集合变更通知与XAML声明式集合初始化,而非用于属性值的双向绑定赋值。
内容的提问来源于stack exchange,提问作者usefulBee
相关产品推荐
相关产品推荐

