【问题标题】: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

标签: c# xamarin binding converters


【解决方案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

【讨论】:

  • 我很有希望,但没有...同样的问题 =(
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多