Xamarin.Forms: MultiBinding IMultiValueConverter 接收空值

Xamarin.Forms: MultiBinding IMultiValueConverter recieving Null values

大家好,我需要帮助。

我在绑定上使用转换器根据对象 ID 设置背景颜色。(stacklayout inside contentview)

<StackLayout.BackgroundColor>
     <Binding Path="objectID" Converter="{StaticResource IntToColorConverter}"/>
</StackLayout.BackgroundColor>

这行得通。 现在我想使用 multiconverter(Xamarin 4.7 中的新功能)return 不同的背景颜色,具体取决于其他对象属性。(对于上下文:对象是日历条目,如果它过去应该去饱和或其他)

<StackLayout.BackgroundColor>
            <MultiBinding Converter="{StaticResource MultiColorConverter}">
                <Binding Path="objectID"/>
                <Binding Path="value"/>
                <Binding Path="value2"/>
            </MultiBinding>
</StackLayout.BackgroundColor>

这不起作用,因为提供给转换器的值都是 NULL,颜色变为黑色(如果所有 vslues 都为 NULL,则 return 值;因此转换器也已正确设置) .当我在转换器上使用断点时,它还显示该数组仅包含 NULL 变量。

我不知道我在这里遗漏了什么,bindingcontext 应该是继承的并且不会改变。任何提示将不胜感激。

绑定上下文是在创建 ContentView 时在内容页面上以编程方式设置的,我在其中提供了对象列表中的一个对象。

var evnt = new TimeTableEventView { BindingContext = Model.calenderevents[j] };

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

在xaml

<StackLayout.BackgroundColor>
            <MultiBinding Converter="{StaticResource MultiColorConverter}">
                <Binding Path="red"/>
                <Binding Path="green"/>
                <Binding Path="blue"/>
               
            </MultiBinding>
</StackLayout.BackgroundColor>

在转换器中

public class MultiColorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        foreach (var value in values)
        {
            if (!(value is int b))
            {
                return Color.White;
                // set a default value when unset
            }
           
        }

        int red = (int)values[0];
        int green = (int)values[1];
        int blue = (int)values[2];

        Color color = Color.FromRgb(red,green,blue);

        return color;
    }

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

在后面的代码中

public class MyViewModel
    {
        public int red { get; set; }
        public int green { get; set; }
        public int blue { get; set; }

        public MyViewModel(int r, int g, int b)
        {
            red = r;
            green = g;
            blue = b;
        }

    }
BindingContext = new MyViewModel(120, 60, 180);