2016-04-27 4 views
1

Ich habe ein ItemControl mit einem dataTemplate erstellt, das ein Rechteck enthält, das basierend auf der ItemsSource eingefärbt wird. Das Datum, das meiner Anwendung zugeführt wird, ist ein Farb-Hex-Code, der das Hash-Zeichen (#) nicht enthält. Nur eine 6-stellige Zeichenfolge. Damit die Farbe korrekt angezeigt wird, muss die 6-stellige Zeichenfolge mit dem # davor formatiert werden. exp # A31F34Wie wird Multibinding.StringFormat für die Fill-Eigenschaft eines Rechtecks ​​verwendet?

Hier ist der 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> 

Ich bin ein MultiBinding.StringFormat mit dem String in einen Hexcode richtig zu formatieren, aber ich bin ratlos, warum die Füllung des Rechtecks nicht einfärben.

Ich bin in der Lage, das Rechteck zum Einfärben zu bekommen, wenn ich die MultiBinding mit einer TextBox mache, dann binden Sie die fill -Eigenschaft des Rechtecks ​​an die Text -Eigenschaft der textBox. Ich würde jedoch lieber direkt aus der Fülleigenschaft des Rechtecks ​​wie in meinem ersten Beispiel binden, da es sauberer ist.

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

Gibt es eine Möglichkeit das erste Beispiel zur Arbeit zu kommen oder bin ich steckte mit dem Code aus dem zweiten Beispiel verwendet?

Antwort

1

Dies kann viel einfacher mit einem Konverter erreicht werden. Sie brauchen nicht einmal MultiBinding dafür. Einfache Binding mit einem Converter sollte es tun:

Hier ist der Konverter:

<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 

Alles, was Sie jetzt tun müssen, ist ein Objekt des Wandlers im Abschnitt Ressourcen zu erstellen:

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

(lokal ist der Namespace Ihres Projekts, in dem Sie diese Konverterklasse definieren)

und dann im Fill verwenden Immobilie:

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

war auf etwas hoffen, die keinen Code hinter sich haben. Ich mag diese Lösung jedoch! – EMAW2008

Verwandte Themen