You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将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,或配合可修改集合的变更通知)。

将它声明为可绑定属性的核心原因有两个:

  1. 支持集合变更通知
    Shell.Items返回的IList<ShellItem>内部是实现了INotifyCollectionChanged的集合类型。注册为可绑定属性后,当集合内元素(如添加/删除FlyoutItem、TabBar)发生变化时,Shell能自动感知并同步更新UI(比如侧边栏导航项)。如果它只是普通CLR属性,Shell无法监听集合的动态变化。

  2. 支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:05:11