XF Binding .. 未找到属性,但仅适用于我的 Android 应用程序,而不适用于 iOS

Ala*_*an2 5 xamarin xamarin.forms

这是我在应用程序输出中看到的错误消息:

Binding: 'GearTapBtnCmd' property not found on 'Memorise.HomeTabPage', 
target property: 'Memorise.HomeTabPage.RightIconTapCommand'
Run Code Online (Sandbox Code Playgroud)

首页TabPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<t:HeadingScrollableView
    PageTitle="Home"
    PageTitleVisible="True"
    RightIconSource="{DynamicResource GearIcon}"
    RightIconTapCommand="{Binding GearTapBtnCmd, Mode=OneWay}"
Run Code Online (Sandbox Code Playgroud)

首页TabPage.xaml.cs

public partial class HomeTabPage : HeadingScrollableView
{
    public HomeTabViewModel vm;

    public HomeTabPage()
    {
        InitializeComponent();
        BindingContext = vm = new HomeTabViewModel();
    }
Run Code Online (Sandbox Code Playgroud)

主页选项卡视图模型

public partial class HomeTabViewModel : BaseViewModel
{
    public IAsyncCommand GearTapBtnCmd { get; private set; }
    
    public HomeTabViewModel()
    {
        GearTapBtnCmd = new MvvmHelpers.Commands.AsyncCommand(OpenPrefAsync);
    }
Run Code Online (Sandbox Code Playgroud)

HeadinsScrollableView.xaml

<?xml version="1.0" encoding="UTF-8"?>
<t:HeadingViewBase 
    Shell.NavBarIsVisible="false"
    x:Class="Memorise.Templates.HeadingScrollableView"
    x:Name="ContentPage"
    xmlns:ffimageloadingsvg="clr-namespace:FFImageLoading.Svg.Forms;assembly=FFImageLoading.Svg.Forms"
    xmlns:t="clr-namespace:Memorise.Templates"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns="http://xamarin.com/schemas/2014/forms"  >
    <t:HeadingViewBase.Content>
       <Grid 
          <Grid.GestureRecognizers>
             <TapGestureRecognizer Command="{Binding Source={x:Reference ContentPage}, Path=RightIconTapCommand}"/>
          </Grid.GestureRecognizers>
       </Grid>
    </t:HeadingViewBase.Content>
</t:HeadingViewBase>
Run Code Online (Sandbox Code Playgroud)

标题滚动视图

[ContentProperty(nameof(InnerContent))]
public partial class HeadingScrollableView : HeadingViewBase
{
    public HeadingScrollableView()
    {
        InitializeComponent();
        BindingContext = this;
    }

    public static readonly BindableProperty RightIconTapCommandProperty =    
             BindableProperty.Create(nameof(RightIconTapCommand), 
             typeof(AsyncCommand), 
             typeof(HeadingScrollableView), 
             default(MvvmHelpers.Commands.Command));

    public AsyncCommand RightIconTapCommand
    {
        get => (AsyncCommand)GetValue(RightIconTapCommandProperty);
        private set => SetValue(RightIconTapCommandProperty, value);
    }
Run Code Online (Sandbox Code Playgroud)

出现警告消息,但代码似乎有效。有没有人知道可能导致警告消息的原因?

Dec*_*oth 4

如何避免“警告”

将构造函数更改HomeTabPage

public HomeTabPage()
{
    // Set the BindingContext before the page is created!
    BindingContext = vm = new HomeTabViewModel(); 
    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

为什么会出现“警告”?

在您发布的代码上,当您创建HomeTabPage

public HomeTabPage()
{
    InitializeComponent();
    BindingContext = vm = new HomeTabViewModel(); 
}
Run Code Online (Sandbox Code Playgroud)

发生的情况是,在您设置aHomeTabPage之前正在对其进行初始化...但是初始化程序确实找到了 a作为其基数,即您设置为的基数BindingContextPageBindingContextPage HeadingScrollableView

public HeadingScrollableView()
{
    InitializeComponent();
    BindingContext = this;
}
Run Code Online (Sandbox Code Playgroud)

因此,由于BindingContext设置为初始化程序所做的就是在this中查找路径,该路径 是它继承的对象或其继承的任何对象,但没有找到它:然后显示“警告”。GearTapBtnCmdHomeTabPage

后来设置BindingContextHomeTabPage了,一切都按预期进行。

当您按照我的建议操作(在初始化BindingContext之前设置)时,会立即发现,并且不会显示任何警告。PageGearTapBtnCmd

为什么仅在 Android 上出现“警告”?

遗憾的是,我没有这个问题的答案,但值得注意的是,该警告仅在调试时出现,而不是在您重建项目时出现(!)。这意味着Android的调试器(应该与iOS的调试器根本不同)是警告的幕后黑手……要确切了解为什么这种情况仅在Android中发生,您可以直接在GitHub中向Xamarin.Forms开发团队询问。 .(如果您发现,请告诉我们)。


但至于你的问题

有谁知道可能导致警告消息的原因是什么?

我想我可能已经给了你答案:D