如何在矩形的 Fill 属性 上使用 Multibinding.StringFormat?

how to use Multibinding.StringFormat on Fill property of a rectangle?

我创建了一个带有 dataTemplate 的 ItemControl,其中包含一个将根据 ItemsSource 着色的矩形。提供给我的应用程序的日期是一个不包含井号 (#) 的彩色十六进制代码。只是一个 6 个字符的字符串。为了让颜色正确显示,我需要用前面的 # 格式化 6 个字符的字符串。 exp #A31F34

这是XAML

<DataTemplate x:Key="ColorSequenceSwatchPreviews">
    <Rectangle Name="ColorSwatch" Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,3,0,3">
        <Rectangle.Style>
            <Style TargetType="{x:Type Rectangle}">
                <Setter Property="Fill">
                    <Setter.Value>
                        <MultiBinding>
                            <MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
                            <Binding Path="InnerXml" Mode="OneWay" />
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </Rectangle.Style>
    </Rectangle>

我正在使用 MultiBinding.StringFormat 将字符串正确格式化为十六进制代码,但我很困惑为什么矩形的填充没有着色。

如果我使用 TextBox 进行 MultiBinding,然后将矩形的填充 属性 绑定到文本框的文本 属性,我就可以让矩形着色。但是,我更喜欢直接从矩形的填充 属性 绑定,就像在我的第一个示例中那样,因为它更干净。

<DataTemplate x:Key="ColorSequenceSwatchPreviews">
<StackPanel Orientation="Horizontal" Margin="0,3,0,3" VerticalAlignment="Center" HorizontalAlignment="Left">
    <TextBox x:Name="Hexcode" Visibility="Collapsed">
        <TextBox.Text>
            <MultiBinding>
                <MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
                <Binding Path="InnerXml" Mode="OneWay" />
            </MultiBinding>
        </TextBox.Text>
    </TextBox>
    <Rectangle Name="ColorSwatch"  Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left">
        <Rectangle.Style>
            <Style TargetType="{x:Type Rectangle}">
                <Setter Property="Fill" Value="{Binding ElementName=Hexcode,Path=,Mode=OneWay}" />
            </Style>
        </Rectangle.Style>
    </Rectangle>
</StackPanel>

有没有办法让第一个示例工作,或者我是否坚持使用第二个示例中的代码?

使用转换器可以更轻松地实现这一点。你甚至不需要 MultiBinding。带有 Converter 的简单 Binding 应该可以做到:

这是转换器:

<ValueConversion(GetType(String), GetType(SolidColorBrush))>
Public Class HexToBrushConverter
  Implements IValueConverter

  Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    Return DirectCast(New BrushConverter().ConvertFrom("#" & value.ToString()), SolidColorBrush)
  End Function

  Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
    Return Nothing
  End Function
End Class

您现在需要做的就是在资源部分创建一个转换器对象:

<local:HexToBrushConverter x:Key="HexToBrushConverter" />

(本地是您定义此转换器的项目的命名空间class)

然后在Fill 属性:

中使用
<Rectangle Fill="{Binding ElementName=Hexcode, Path=, Mode=OneWay, Converter={StaticResource HexToBrushConverter}}" />