ContentView 中的 MAUI 编译绑定

问题描述 投票:0回答:1

我在阅读 MS 编译绑定文档时遇到了这个问题,现在它让我对如何在 ContentViews

 上为自定义控件进行数据绑定感到困惑:

重要

对于定义 Source 属性的任何绑定表达式,编译绑定均被禁用。这是因为 Source 属性始终使用 x:Reference 标记扩展进行设置,而该扩展无法在编译时解析。

此外,多重绑定当前不支持编译绑定。

我的问题涉及

ContentViews

 您在何处绑定到控件上的 
BindableProperty

文档中的(推荐)方法涉及使用

x:Reference

 设置控件的绑定上下文,如下所示:

<ContentView x:Class="LoadTimeTestingWithAsync.Controls.DriverCard" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Name="driverCard"> <VerticalStackLayout BindingContext="{x:Reference driverCard}"> <Label SemanticProperties.HeadingLevel="Level1" Style="{StaticResource Headline}" Text="Driver Details" /> <Label SemanticProperties.HeadingLevel="Level1" Style="{StaticResource SubHeadline}" Text="{Binding DriverInfo.FullName}" /> </VerticalStackLayout> </ContentView>
这是否意味着已编译的绑定未用于第二个标签绑定,因为 

BindingContext

 是使用 
StackLayout
x:Reference
 上设置的?

或者只有在指定来源时才如此:

<ContentView x:Class="LoadTimeTestingWithAsync.Controls.DriverCard" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Name="driverCard"> <VerticalStackLayout> <Label SemanticProperties.HeadingLevel="Level1" Style="{StaticResource Headline}" Text="Driver Details" /> <Label SemanticProperties.HeadingLevel="Level1" Style="{StaticResource SubHeadline}" Text="{Binding DriverInfo.FullName, Source={x:Reference driverCard}}" /> </VerticalStackLayout> </ContentView>
两者都使用 

x:Reference

,但只有第二个使用 
Source

是源属性本身还是

x:Reference

意味着不会使用编译的绑定?蓝色通知有点暗示 
x:Reference
 是其措辞方式的原因,但也许如果它用于指定 
BindingContext
,那么下面的任何绑定仍将使用已编译?

我想遵循记录的示例可能是最好的方法,但我只是想仔细检查一下。

data-binding maui custom-controls contentview compiled-bindings
1个回答
0
投票
正如医生所说,

Compiled bindings are disabled for any binding expressions that define the Source property. This is because the Source property is always set using the x:Reference markup extension, which can't be resolved at compile time.


因此,如果使用

x:Reference

 进行绑定,数据绑定将不会被预编译(而 XAML 的其余部分将被预编译)。

顺便说一下,我还没有看到控件上设置了任何

x:DataType

,所以编译后的绑定无论如何都不会被使用。

实际上,您可以检查生成的输出或测试它,例如

Text="{Binding WrongName,Source={x:Reference driverCard}}" x:DataType="local:CustomView"
如果您像上面一样使用

x:Reference

,即使您设置了
x:DataType
,仍然没有绑定表达式的编译时验证,您可能只会发现数据绑定直到运行时才起作用。

© www.soinside.com 2019 - 2024. All rights reserved.