为啥这个 xamarin Binding Converter 会使应用程序崩溃?

Posted

技术标签:

【中文标题】为啥这个 xamarin Binding Converter 会使应用程序崩溃?【英文标题】:Why this xamarin Binding Converter crashs the application?为什么这个 xamarin Binding Converter 会使应用程序崩溃? 【发布时间】:2020-08-30 02:57:19 【问题描述】:

我有一个布尔属性,我想将其否定值(!值)绑定到一个按钮,但是每次我在 xaml 标记中配置转换器时,它都会毫无例外地终止应用程序,我在应用程序中心没有发现任何错误.如果我删除这部分 , Converter=StaticResource inverter 一切都会恢复,但没有转换。

我的xml:

<ContentPage.Resources>
        <local:BooleanConverter x:Key="inverter" />
...

<ContentPage.Resources>

...

<controls:FrameButton IsEnabled="Binding IsBusy, Converter=StaticResource inverter" Margin="5" CornerRadius="5">

还有我的 BooleanConverter.cs:

using System;
using Xamarin.Forms;

public class BooleanConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !System.Convert.ToBoolean(value);
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !System.Convert.ToBoolean(value);
    

更新 1

框架按钮代码:

using Xamarin.Forms;

namespace CustomControls.Controls

    public class FrameButton : Frame
    
        public FrameButton()
        
            var MyTapGesture = new TapGestureRecognizer();
            MyTapGesture.Tapped += (sender, e) =>  Clicked(); ;
            GestureRecognizers.Add(MyTapGesture);
        

        public async void Clicked()
        
            await this.ScaleTo(1.1, 100);
            await this.ScaleTo(1, 100);
        
    

【问题讨论】:

尝试添加 try/catch,和/或使用调试器单步执行代码并跟踪错误 我使用您提供的代码进行测试,以设置按钮的布尔值。它运作良好。我们需要更多信息来重现。你能为此提供FrameButton吗?您是否尝试卸载并重新安装该应用程序或在其他设备上进行测试?应用程序是否再次崩溃? @Jason 已尝试 Convert(..) try catch 但没有输出任何内容 @WendyZang-MSFT 是的,我尝试在两个不同的设备中清理解决方案、重建和测试。我现在会用 FrameButton 更新我的问题 @ÉderRochaBezerra 我制作了代码示例以使用 FrameButton 进行测试。它运作良好。你可以从 GitHub 下载查看。 github.com/WendyZang/Test/tree/master/Converters/inverterDemo 【参考方案1】:

使用显式转换,因为您总是知道value 将是一个布尔值,除非您使用错误。一般不使用ConvertBack,因为它通常没有意义。

using System;
using Xamarin.Forms;

public class BooleanConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !((bool)value);
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
    

【讨论】:

我试过你的代码,但问题仍然存在......完全相同的问题。 你能发布一个堆栈跟踪吗?还是输出窗口信息? 我能找到的唯一信息是:[libc] Fatal signal 11 (SIGSEGV), code 2, fault addr 0x794bb2bce8 in tid 26734 (com.MyApp.Beta) 通常,如果您在输出窗格中继续向上滚动,您将能够找到实际的异常或至少提及您的代码位置。 在开始这个有问题的页面并仔细阅读之前,我正在清理所有内容,但没有别的了。【参考方案2】:

也许是因为它试图将 IsEnabled 值转换回来。 您是否尝试过使其成为OneWay 例如

IsEnabled="Binding IsBusy, Mode=OneWay, Converter=x:StaticResource BooleanConverter"

编辑考虑您的评论。

我认为 SEGSEGV 错误是内存分段错误,即内存读取错误。所以可能没有找到inverter

我发现其中一些深奥的错误消息通常是由 XAML 代码中的错误触发的。

我看到您对该页面的转换器声明是:

<ContentPage.Resources>
        <local:BooleanConverter x:Key="inverter" />
...

<ContentPage.Resources>

通常声明是:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:BooleanConverter x:Key="inverter" />
...
    </ResourceDictionary>
<ContentPage.Resources>

我怀疑与被调用键“inverter”的关系没有声明,因为它不在ResourceDictionary

【讨论】:

我很有希望,但没有...同样的问题 =(

以上是关于为啥这个 xamarin Binding Converter 会使应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Android Binding 源自github第三方库的绑定(中级教学)----aar文件

自定义控件的 Xamarin 数据绑定值计算为 Xamarin.Forms.Binding

Xamarin.Android Binding 源自github第三方库的绑定(高级教学)----aar文件

Xamarin + Android + Binding YouTube 视频播放器编译错误

Xamarin.Android Binding-----百度地图SDK

Xamarin iOS Binding 项目似乎不包含库或接口定义