MAUI怎么创建可绑定的属性 BindableProperty教程
发布时间 - 2026-01-21 00:00:00 点击率:次在 MAUI 中创建可绑定属性需四步:1. 声明 public static readonly BindableProperty 字段;2. 定义 .NET 属性包装器调用 GetValue/SetValue;3. 用 BindableProperty.Create 注册,指定名称、类型、宿主类、默认值等;4. 可选添加 propertyChanged 回调。
在 MAUI 中创建可绑定属性(BindableProperty)是实现数据绑定、自定义控件和响应式 UI 的核心技能。它不是普通 C# 属性,而是 MAUI 框架识别的“注册属性”,支持绑定、样式、动画、模板等高级功能。
为什么不能直接用普通属性?
普通 C# 属性(如 public string Title { get; set; })无法被 MAUI 绑定系统识别,也不能参与属性值变更通知、默认值管理或属性继承。只有通过 BindableProperty.Create() 注册的属性,才能真正接入 MAUI 的绑定管道。
四步创建 BindableProperty(以自定义 Label 为例)
假设你要为一个继承自 Label 的自定义控件添加一个可绑定的 Subtitle 属性:
-
1. 声明静态 BindableProperty 字段:必须是
public static readonly,命名惯例为PropertyNameProperty -
2. 定义 .NET 属性包装器:提供简洁的 get/set 语法,内部调用
GetValue()和SetValue() - 3. 调用 BindableProperty.Create():指定类型、宿主类型、默认值、绑定模式等关键参数
- 4. (可选)添加属性更改回调:用于监听值变化并触发 UI 更新或逻辑处理
完整代码示例:
public class CustomLabel : Label
{
// 1. 静态只读 BindableProperty 字段
public static readonly BindableProperty SubtitleProperty =
BindableProperty.Create(
propertyName: nameof(Subtitle),
returnType: typeof(string),
declaringType: typeof(CustomLabel),
defaultValue: string.Empty,
defaultBindingMode: BindingMode.OneWay,
propertyChanged: OnSubtitleChanged);
// 2. .NET 属性包装器
public string Subtitle
{
get => (string)GetValue(SubtitleProperty);
set => SetValue(SubtitleProperty, value);
}
// 3. 可选:值变更回调
private static void OnSubtitleChanged(BindableObject bindable, object oldValue, object newValue)
{
if (bindable is CustomLabel label)
{
// 在这里更新 UI 或触发逻辑,例如刷新布局
label.InvalidateLayout();
}
}}
常用参数说明与避坑点
BindableProperty.Create() 有多个重载,最常用的是带 6 个参数的版本:
- propertyName:必须与包装器属性名完全一致(包括大小写),否则绑定失败
-
returnType:属性实际类型,如
typeof(bool)、typeof(Color) -
declaringType:当前类类型(
typeof(MyControl)),不能写成基类 -
defaultValue:值类型传字面量(
0、false),引用类型建议用null或string.Empty,避免共享可变对象 -
defaultBindingMode:常用
OneWay(默认)、TwoWay(如输入控件)、OneTime -
propertyChanged:回调方法签名固定为
(BindableObject, object, object),务必检查bindable类型再转型
在 XAML 中使用和绑定
注册完成后,你就能像内置属性一样使用:
注意:无需额外标记或特性,MAUI 会自动发现 SubtitleProperty 字段并关联到 Subtitle 属性。
基本上就这些。只要记住:先注册字段、再写包装器、别拼错名字、默认值别传错类型——BindProperty 就不会“失灵”。
# c#
# .net
# 为什么
# Static
# String
# Object
# NULL
# bool
# 继承
# 值类型
# 引用类型
# public
# 对象
# typeof
# ui
# 绑定
# 默认值
# 自定义
# 可选
# 回调
# 的是
# 在这里
# 你就
# 多个
# 为例
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速生成专业多端适配建站电话?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
微信公众帐号开发教程之图文消息全攻略
魔方云NAT建站如何实现端口转发?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
北京网站制作的公司有哪些,北京白云观官方网站?
b2c电商网站制作流程,b2c水平综合的电商平台?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
详解jQuery中的事件
phpredis提高消息队列的实时性方法(推荐)
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何在建站之星网店版论坛获取技术支持?
如何在VPS电脑上快速搭建网站?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何用PHP快速搭建CMS系统?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
高防服务器如何保障网站安全无虞?
iOS发送验证码倒计时应用
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
如何在建站主机中优化服务器配置?
iOS UIView常见属性方法小结
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何创建自定义Facades?(详细步骤)
如何在景安服务器上快速搭建个人网站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
iOS中将个别页面强制横屏其他页面竖屏
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel如何使用Livewire构建动态组件?(入门代码)
如何在Windows虚拟主机上快速搭建网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
JS弹性运动实现方法分析
Linux系统运维自动化项目教程_Ansible批量管理实战
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
郑州企业网站制作公司,郑州招聘网站有哪些?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何在云主机上快速搭建多站点网站?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)


