.NET MAUI 9 中的绑定和相对源问题 - 发布版本需要 XamlCompilationOptions.Skip

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

我正在开发 .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 代码”错误。

重现步骤:

  1. x:DataType
    设置在
    ContentPage
    上。
  2. 使用
    BindingContext
    从祖先元素的
    RelativeSource
    绑定命令,如上所示。
  3. 尝试在发布模式下构建项目。

我尝试过的:

  • 我尝试通过将
    MauiEnableXamlCBindingWithSourceCompilation
    设置为
    false
    来禁用 XAML 编译,但这会导致性能问题,我不想禁用此功能。
  • 我还尝试使用以下方法修改项目设置:
<TrimMode>partial</TrimMode>
<Optimize>false</Optimize>
<AndroidLinkMode>None</AndroidLinkMode>

但是,这些更改并没有解决问题。

预期行为: 绑定应该无需禁用 XAML 编译即可工作,并且应该允许从 ViewModel 正确绑定命令。

问题: 有没有办法在 .NET MAUI 9 中正确使用

RelativeSource
x:DataType
绑定,而不会在发布版本中遇到“无效的 IL 代码”错误?如果没有,是否有解决方法来避免禁用 XAML 编译?

xaml binding maui
1个回答
0
投票

我还没有看到您遇到的确切问题,但我建议直接绑定到您的视图模型,而不是通过

BindingContext
绑定中的
Command
。我昨天才了解到这一点,但是如果您将
RelativeSource
与不是
AncestorType
派生类的
Element
一起使用,MAUI 会自动使用
FindAncestorBindingContext
模式。您可以在绑定本身中设置数据类型以指示您尝试绑定的类型。两次输入相同的类型有点烦人,但它确实有效。

例如,您的绑定将是(为了清楚起见,这里分为多行,但显然所有这些都需要位于 XAML 中的同一行中):

Command="{Binding
    Source={RelativeSource AncestorType={x:Type local:YourViewModelType}}, 
    Path=EditPersonCommand,
    x:DataType=local:YourViewModelType
    }"
© www.soinside.com 2019 - 2024. All rights reserved.