You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI转换器被两次调用,第二次传Null致崩溃求助

MAUI转换器Convert方法两次调用(第二次value为null)的问题解决

问题场景

开发MAUI应用时,绑定到Picker的IsVisible属性的转换器,Convert()方法被调用两次,第二次传入的value为null,引发空引用异常导致应用崩溃,相同代码在Xamarin.Forms中可正常运行。

相关代码:

XAML代码

<Picker Title="Choose Tile Thickness..."
        ItemsSource="{Binding TileThicknessesMetric}"
        ItemDisplayBinding="{Binding Value}"
        SelectedItem="{Binding SelectedTileThickness}"
        IsVisible="{Binding SelectedUnit, Converter={converters:SelectedUnitToBoolShowMetricConverter}, Mode=TwoWay}"
        Style="{StaticResource PickerStyle}"
        Grid.Row="2" Grid.Column="1" />

转换器代码

class SelectedUnitToBoolShowMetricConverter : IValueConverter, IMarkupExtension
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((Unit)value).Code == UnitCode.Metric;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

解决思路

  1. 在转换器中添加null值校验
    修改Convert方法,先判断传入的value是否为有效Unit实例,避免空引用:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is not Unit unit)
        return false; // 根据业务需求设置合适的默认可见性
    return unit.Code == UnitCode.Metric;
}
  1. 调整绑定Mode为OneWay
    IsVisible是控件单向属性,不需要将可见性变化回传给ViewModel,将绑定Mode改为OneWay可减少不必要的绑定触发:
IsVisible="{Binding SelectedUnit, Converter={converters:SelectedUnitToBoolShowMetricConverter}, Mode=OneWay}"
  1. 提前初始化ViewModel中的SelectedUnit
    在ViewModel构造函数中为SelectedUnit设置默认值,避免绑定初期值为null:
public class YourViewModel
{
    public Unit SelectedUnit { get; set; }
    public IEnumerable<Unit> TileThicknessesMetric { get; set; }

    public YourViewModel()
    {
        // 初始化默认Unit实例,比如取集合第一个元素或默认Metric单位
        TileThicknessesMetric = // 你的数据源初始化逻辑
        SelectedUnit = TileThicknessesMetric.FirstOrDefault() ?? new Unit { Code = UnitCode.Metric };
    }
}

差异说明

Xamarin.Forms与MAUI的绑定生命周期存在差异,MAUI在控件初始化或绑定上下文更新时可能会额外触发一次Convert调用,此时ViewModel的SelectedUnit可能尚未完成初始化,导致传入null值;而Xamarin.Forms的绑定触发时机或ViewModel初始化顺序避免了这种情况。

内容的提问来源于stack exchange,提问作者David Shochet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 02:03:21