PAYATHON 2026

.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 默认启用该功能,如果项目曾主动关闭,需要恢复。相关要求见 官方编译绑定说明。

备注:内容仅供参考。