【问题标题】:MultiBinding in Xamarin Forms: element is nullXamarin 表单中的 MultiBinding:元素为空
【发布时间】:2021-01-22 10:24:48
【问题描述】:

我正在尝试将 MultiBinding 与 Xamarin.Forms 4.8 一起使用,但无法正常工作。我有这个非常简单的转换器:

public class QuantityLabelConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return "Hello World";
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我正在尝试在 XAML 标签中使用它,如下所示:

<Label>
    <Label.Text>
        <MultiBinding Converter="{StaticResource QuantityLabelConverter}">
            <Binding Path="SelectedQuantity" />
            <Binding Path="OutstandingQuantity" />
        </MultiBinding>
    </Label.Text>
</Label>

现在,当我调试时,我可以看到转换器被调用了 3 次:一次有两个空值,然后是设置 SelectedQuantity 值时的另一次,最后一次是分配 OutstandingQuantity 值时。所以绑定和转换器之间的链接似乎工作正常。

但是,页面崩溃并且我得到一个“值不能为空。\n参数名称:元素”System.ArgumentNullException。

如果我用简单的 XAML 替换以前的 XAML

<Label Text="Hello World">

页面显示没有问题,所以MultiBinding的设置方式有问题,但我不知道是什么...

【问题讨论】:

  • 嗨,有更新吗?
  • 嗨卢卡斯,很抱歉耽搁了这么久,直到今天我才有机会回到这个问题......今天它可以正常工作了????。我刚刚重新应用了上周隐藏在 git 中的代码,所以......要么是在我发布问题后发布的 XF 更新修复了它(这似乎很可能),要么我第一次犯了一个愚蠢的错误,然后搞砸了测试/尝试修复我的代码(这也是可能的)。非常感谢您的帮助,我会将您的答案标记为解决方案,因为我相信您的详细示例将对开始使用 MultiBinding 的其他人有所帮助。

标签: c# xaml xamarin.forms multibinding


【解决方案1】:

您需要返回 BindableProperty.UnsetValue 才能使用绑定 FallbackValue 。

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        foreach (var value in values)
        {
            if (!(value is string b))
            {
                return "xxx";
                // set a default value when unset
            }

        }

        string str1 = values[0].ToString();
        string str2 = values[1].ToString();

        return str1+str2;
    }

##更新

我已经测试了样本并找到了原因

如果你想绑定 ViewModel 的属性。您需要实现属性的接口 INotifyPropertyChanged 而不是 BindableObject 。

public class MainViewModel : INotifyPropertyChanged
{



    string _name="";
    string _surname="";

    public string Name
    {
        get { return _name; }
        set
        {
            if(_name!=value)
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    public string Surname
    {
        get { return _surname; }
        set
        {
            if(_surname!=value)
            {
                _surname = value;
                OnPropertyChanged("Surname");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class NameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            foreach (var value in values)
            {
                if (!(value is string b))
                {
                    return " ";
                    // set a default value when unset
                }

            }

            string str1 = values[0].ToString();
            string str2 = values[1].ToString();

            return str1 + str2;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

【讨论】:

  • 好吧,也许今天不是我最开心的一天,但是……有什么不同? (我的意思是,我总是返回一个字符串值,而不管绑定值如何)
  • 您使用的是哪个版本的 Xamarin Forms?我刚刚发现:github.com/xamarin/Xamarin.Forms/issues/12094。如果您在此处查看我的评论(我下载了一个示例项目来测试 Multibinding),似乎 XF4.8 已损坏:((非常感谢您提供帮助,我在之前的评论中忘记提及了) !)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2010-12-02
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2021-06-08
  • 2022-01-23
相关资源
最近更新 更多