我在阅读 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
,那么下面的任何绑定仍将使用已编译?我想遵循记录的示例可能是最好的方法,但我只是想仔细检查一下。
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
,仍然没有绑定表达式的编译时验证,您可能只会发现数据绑定直到运行时才起作用。