Конвертер привязки с параметром в однострочном синтаксисе - PullRequest
0 голосов
/ 09 мая 2020

Я в основном пытаюсь сформулировать следующие условия привязки в одной строке / теге:

<Rectangle.Fill>
     <Binding Path="Contents.Value">
          <Binding.Converter>
               <localVM:SquareConverter Empty="White" Filled="Black" Unknown="Gray"/>
           </Binding.Converter>
      </Binding>
</Rectangle.Fill>

Кажется, я не могу понять, как указать параметры выше Empty="white" Filled="Black" Unkown="gray"

То, что у меня есть:

 <Button Background="{Binding Path=Contents.Value, Converter={StaticResource localVM:SquareConverter}, ConverterParameter={ }}">

Я даю ему ресурс, я думаю, теперь я не могу понять, как указать параметры синтаксически правильно?

PS Не беспокоиться о контексте, фон кнопки отображается на заливку прямоугольника через шаблон управления et c.

1 Ответ

0 голосов
/ 09 мая 2020

Вы могли заметить, что количество параметров, которые вы можете передать в Converter, равно 1. Вы можете передать массив строк или что-то еще, но я считаю, что было бы проще записать все ваши аргументы в одной строке и ручка. Например: "Empty=White|Filled=Black|Unknown=Gray"

Ваш конвертер должен выглядеть так:

public class SquareConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string arg && parameter is string str)
        {
            string[] splits = str.Split("|"); // split by the delimiter
            var colorConverter = new ColorConverter(); // required to convert invariant string to color
            foreach (var kv in splits)
            {
                if(kv.StartsWith(arg, StringComparison.OrdinalIgnoreCase))
                {
                    var v = kv.Split("=")[1]; // get the value from key-value
                    var color = (Color)colorConverter.ConvertFromInvariantString(v); // convert string to color
                    var brush = new SolidColorBrush(color); // convert color to solid color brush
                    return brush;
                }
            }
        }

        return default;
    }

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

в вашем xaml

xmlns:c="clr-namespace:WpfApp.Converters"

<Window.Resources>
    <c:SquareConverter x:Key="SquareConverter"/>
</Window.Resources>

<Rectangle Fill="{Binding Path=Contents.Value,
                          Converter={StaticResource SquareConverter},
                          ConverterParameter='Empty=White|Filled=Black|Unknown=Gray'}"/>
...