Xamarin.Forms: MultiBinding IMultiValueConverter, получающий значения Null - PullRequest
0 голосов
/ 06 августа 2020

Привет, ребята, мне нужна помощь.

Я использую конвертер для привязки, чтобы установить цвет фона в зависимости от идентификатора объекта. (Stacklayout внутри contentview)

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

Это работает . Теперь я хочу использовать мультиконвертер (новый в Xamarin 4.7) для возврата другого цвета фона в зависимости от других свойств объекта. (Для контекста: объект является календарем, и если он в прошлом, он должен быть ненасыщенным или что-то в этом роде)

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

Это не работает, поскольку все значения, которые передаются конвертеру, равны NULL, а цвет становится черным (возвращаемое значение, если все vslues равны NULL; значит, конвертер также настроен правильно). Это также показывает, когда я использую точку останова на преобразователе, что массив содержит только переменные NULL.

Я не знаю, что мне здесь не хватает, контекст привязки должен быть унаследован и не изменяется. Приветствуются любые подсказки.

Контекст привязки устанавливается программно на странице содержимого при создании ContentView, где я предоставляю объект из списка объектов.

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

1 Ответ

0 голосов
/ 06 августа 2020

Вам необходимо вернуть BindableProperty.UnsetValue, чтобы использовать привязку FallbackValue.

в xaml

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

в Converter

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

введите описание изображения здесь

...