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

Posted

技术标签:

【中文标题】使用一行语法中的参数绑定转换器【英文标题】:Binding Converter with paramater in one line syntax 【发布时间】:2020-08-24 20:49:10 【问题描述】:

我基本上试图在一行/标签中制定以下绑定条件:

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

我认为资源很好,现在我不知道如何指定语法正确的参数?

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

【问题讨论】:

EmptyFilledUnknown 属性从何而来?它是转换器的一部分吗?在您的问题中分享它是有意义的 您可以将converer声明为资源并通过StaticResource表达式引用它。但是,如果您需要为每个 Binding 提供单独的转换器实例,那将没有多大意义。 @PavelAnikhouski 是的,抱歉,它们是转换器的一部分,所以如果值为 Empty,则将背景转换为白色等,但 Clemens 评论成功了 【参考方案1】:

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

【讨论】:

哦,好的,这让我有了更多的见识,拓宽了我能做的事情,感谢您的时间

以上是关于使用一行语法中的参数绑定转换器的主要内容,如果未能解决你的问题,请参考以下文章

参数绑定

spirng 数据绑定

阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门

PHP PostgreSQL PDO 无法使用 LIKE 绑定参数

SpringMVC 从入门到精通系列 02——请求参数的绑定

如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递