.NET MAUI 无 ViewModel 的 ContentPage 如何使用编译绑定?
数据小许
可以。已经设置了 BindingContext = this,绑定源就是当前 EditPage 实例,因此应将 x:DataType 指定为 EditPage。使用编译绑定不需要额外创建 ViewModel。
在 ContentPage 上声明类型
根据现有的 x:Class="SleepDiary.EditPage",添加命名空间声明 xmlns:local="clr-namespace:SleepDiary",再设置 x:DataType="local:EditPage":
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:SleepDiary"
x:Class="SleepDiary.EditPage"
x:DataType="local:EditPage"
Title="EditPage">
<VerticalStackLayout>
<Button
x:Name="SaveAndCloseButton"
Text="Save and close"
BackgroundColor="{Binding backgroundcolor}"
Clicked="SaveAndClose" />
</VerticalStackLayout>
</ContentPage>
保留构造函数中的设置即可:
public EditPage(SleepDateWithBoolean CurrentSleepDateEditPopup)
{
InitializeComponent();
BindingContext = this;
// 其余初始化代码
}
local 是自定义的 XAML 命名空间前缀,映射到页面所在的 C# 命名空间 SleepDiary。
为什么指定页面类型就能生效?
BindingContext 决定运行时从哪个对象读取属性,x:DataType 告诉 XAML 编译器该对象的类型。这里分别对应当前页面实例和 EditPage 类型。
这样编译器就可以在 EditPage 上解析 backgroundcolor。在页面根元素声明 x:DataType 后,子元素可以沿用该声明,按钮的绑定表达式无需修改。即使绑定上下文是在 C# 中设置的,也可以使用编译绑定。参见 Microsoft Learn:编译绑定。
只为按钮指定类型怎么写?
如果只想给按钮标注类型,先声明 xmlns:local,然后这样写:
<Button
x:Name="SaveAndCloseButton"
x:DataType="local:EditPage"
Text="Save and close"
BackgroundColor="{Binding backgroundcolor}"
Clicked="SaveAndClose" />
问题中的内联写法也应将 ??? 填为 local:EditPage:
BackgroundColor="{Binding backgroundcolor, x:DataType=local:EditPage}"
如果整个页面都绑定自身属性,在 ContentPage 上声明一次更方便。
配置时需要注意什么?
- 保留
BindingContext = this。单独设置x:DataType不会将运行时绑定源设为页面。 - 绑定路径仍是
backgroundcolor,大小写要与 C# 属性一致;目标属性是按钮的BackgroundColor。 - 如果某个子元素改用了其他类型的
BindingContext,需要在相应位置重新声明匹配的x:DataType。 - 编译绑定需要启用 XAML 编译。.NET MAUI 默认启用该功能,如果项目曾主动关闭,需要恢复。相关要求见 官方编译绑定说明。
备注:内容仅供参考。
