Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin表单中的多重绑定:元素为null_C#_Xaml_Xamarin.forms_Multibinding - Fatal编程技术网

C# Xamarin表单中的多重绑定:元素为null

C# Xamarin表单中的多重绑定:元素为null,c#,xaml,xamarin.forms,multibinding,C#,Xaml,Xamarin.forms,Multibinding,我正在尝试对Xamarin.Forms 4.8使用多重绑定,但我无法让它工作。我有一个非常简单的转换器: public class QuantityLabelConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { return "Hello Worl

我正在尝试对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>

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

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

如果我用一个简单的

<Label Text="Hello World">


页面显示没有问题,因此多重绑定的设置有问题,但我不知道什么…

您需要返回BindableProperty.UnsetValue才能使用绑定回退值

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));
    }
}

好吧,也许今天不是我最开心的一天,但是。。。有什么区别?(我的意思是,不管绑定值是什么,我总是返回一个字符串值)您使用的是什么版本的Xamarin表单?我刚发现这个:。如果你看我的评论(我下载了一个示例项目来测试多重绑定),似乎XF4.8已经崩溃了:((非常感谢你的帮助,我在之前的评论中忘了提到它!)嗨,有更新吗?嗨,卢卡斯,很抱歉耽搁了这么长时间,直到今天我才有机会回到这个问题上来……今天它工作正常
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();
        }
    }