2016-04-27 8 views
1

ItemsSourceに基づいて色付けされる四角形を含むdataTemplateでItemControlを作成しました。私のアプリケーションに供給される日付は、ハッシュ記号(#)を含まないカラー16進コードです。ちょうど6文字の文字列。色が正しく表示されるようにするには、6文字の文字列の先頭に#を付ける必要があります。 EXP#A31F34長方形のFillプロパティにMultibinding.StringFormatを使用する方法は?

は、ここで私はきちんとHexcodeに文字列をフォーマットするMultiBinding.StringFormatを使用していますが、長方形の塗りつぶしがある理由として困惑しています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> 

です着色しない。

TextBoxでMultiBindingを行うと四角形が色づけされ、次に四角形のfillプロパティがtextBoxのTextプロパティにバインドされます。しかし、私は最初の例のように矩形の塗りつぶしプロパティから直接バインドするほうがはるかに好きです。

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

動作する最初の例を取得するか、私は2番目の例のコードを使用して立ち往生しています方法はありますか?

答えて

1

これは、コンバータを使用するとはるかに簡単に達成できます。それにはMultiBindingも必要ありません。シンプルConverterBindingはそれを行う必要があります。

をここコンバータです:

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

(ローカルはこのコンバータクラスを定義するプロジェクトの名前空間です)

Fillプロパティ:

<Rectangle Fill="{Binding ElementName=Hexcode, Path=, Mode=OneWay, Converter={StaticResource HexToBrushConverter}}" /> 
+0

は、後ろにコードが含まれていないことを望んでいました。私はこの解決策が好きです! – EMAW2008

関連する問題