为啥这个 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 视频播放器编译错误