我正在开发 .NET MAUI 9 应用程序,在 XAML 中设置
RelativeSource
时使用 x:DataType
时遇到绑定问题。具体来说,当我尝试使用 ContentPage
将 RelativeSource
中的命令绑定到按钮时,我在发布版本期间收到错误。该错误在 InitializeComponent
期间提到“无效的 IL 代码”,除非我设置 XamlCompilationOptions.Skip
。
这是我正在使用的代码:
<Button
Grid.Column="2"
Margin="{StaticResource PersonRoundEditButtonMargin}"
Command="{Binding Source={RelativeSource AncestorType={x:Type ContentPage}}, Path=BindingContext.EditPersonCommand}"
CommandParameter="{Binding Id}"
CornerRadius="{StaticResource PersonRoundEditButtonRadius}"
HeightRequest="{StaticResource PersonRoundEditButtonSize}"
ImageSource="pencil.png"
VerticalOptions="Start"
WidthRequest="{StaticResource PersonRoundEditButtonSize}" />
问题的出现是因为我需要使用
RelativeSource
来绑定来自 ContentPage
的 BindingContext
的命令,但我还为类型安全设置了 x:DataType
并且需要传递 Person
的 Id
与命令一起。当我不使用以下方法禁用 XAML 编译时:
<MauiEnableXamlCBindingWithSourceCompilation>false</MauiEnableXamlCBindingWithSourceCompilation>
该解决方案将无法构建并在
InitializeComponent
上抛出“无效的 IL 代码”错误。
重现步骤:
x:DataType
设置在 ContentPage
上。BindingContext
从祖先元素的 RelativeSource
绑定命令,如上所示。我尝试过的:
MauiEnableXamlCBindingWithSourceCompilation
设置为 false
来禁用 XAML 编译,但这会导致性能问题,我不想禁用此功能。<TrimMode>partial</TrimMode>
<Optimize>false</Optimize>
<AndroidLinkMode>None</AndroidLinkMode>
但是,这些更改并没有解决问题。
预期行为: 绑定应该无需禁用 XAML 编译即可工作,并且应该允许从 ViewModel 正确绑定命令。
问题: 有没有办法在 .NET MAUI 9 中正确使用
RelativeSource
与 x:DataType
绑定,而不会在发布版本中遇到“无效的 IL 代码”错误?如果没有,是否有解决方法来避免禁用 XAML 编译?
我还没有看到您遇到的确切问题,但我建议直接绑定到您的视图模型,而不是通过
BindingContext
绑定中的 Command
。我昨天才了解到这一点,但是如果您将 RelativeSource
与不是 AncestorType
派生类的 Element
一起使用,MAUI 会自动使用 FindAncestorBindingContext
模式。您可以在绑定本身中设置数据类型以指示您尝试绑定的类型。两次输入相同的类型有点烦人,但它确实有效。
例如,您的绑定将是(为了清楚起见,这里分为多行,但显然所有这些都需要位于 XAML 中的同一行中):
Command="{Binding
Source={RelativeSource AncestorType={x:Type local:YourViewModelType}},
Path=EditPersonCommand,
x:DataType=local:YourViewModelType
}"