在一行语法中使用参数绑定转换器

Binding Converter with paramater in one line syntax

我基本上是想在一个 line/tag 中制定以下绑定条件:

<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={ }}">

我认为资源很好,现在我找不到如何在语法上正确指定参数?

P.S。不用担心上下文,按钮背景通过控件模板等映射到矩形填充。

您可能已经注意到,您可以传递给 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'}"/>