2016-09-19 3 views
0

Ich habe eine MVVM für Border Hintergrundbindung, wo in I Farbnamen aus einer Datei im String-Format lesen und wandeln sie um den Code zu Pinsel:Pinsel MVVM Bindung gibt nicht die Farbe namens

Brush b1 = new SolidColorBrush((Color)ColorConverter.ConvertFromString("Red"); 
myItem.Background = b1; 

Hintergrund ist ein definierte Eigenschaft in Ansichtsmodell als:

public Brush Background 
{ 
    get { return _background; } 
    set 
    { 
     this._background = value; 
     RaisePropertyChanged("Background"); 
    } 
} 

Und es wird in XAML als zugegriffen:

<Border Background="{Binding Background}"> 
    <Border.Style> 
     <Style TargetType="{x:Type Border}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Background}" Value="Red"> 
        <Setter Property="Height" Value="40"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
</Border> 

Die Grenze ist richtig eingefärbt - keine Probleme.

Das Problem ist DataTrigger wird nie ausgelöst, da, wenn ich den Wert von this._background in der Methode set sehen, ist es "# FFFF0000" und es ist nicht gleich Brushes.Red (ich habe versucht, Wert in SolidColorBrush zu konvertieren und dann verglichen mit Brushes.Red, aber es ist nicht gleich).

Was mache ich falsch? Was kann ich tun, um sicherzustellen, dass die Farbnamen, die ich aus einer Datei gelesen habe, richtig in Brushes konvertiert wurden. * Damit mein DataTrigger funktioniert.

Danke,

RDV

Antwort

1

Ja, Brushes.Red ein SolidColorBrush. Keine Farbe, ein Pinsel. Verwirrung entsteht durch die implizite Umwandlung der Zeichenfolge "Red" in XAML in ein Brush-Objekt. Aber eine neue SolidColorBrush Instanz mit einer , die auch gleich #FFFF0000 ist, wird eine andere Instanz von SolidColorBrush sein, und sie werden nicht "gleich" sein.

Aber es ist Ihnen egal, welche Pinsel Instanz es ist; Sie interessieren sich für die Farbe. Vergleichen Sie also die Farbe. (Brushes.Red.Color == Colors.Red) == true. Color ist ein Werttyp, kein Referenztyp, daher werden zwei äquivalente Werte als gleich angesehen.

<DataTrigger 
    Binding="{Binding Background.Color, RelativeSource={RelativeSource Self}}" 
    Value="Red"> 

Beachten Sie, dass Background nicht eine Eigenschaft des DataContext ist. Das war eine zweite Sache, die nicht mit deinem Code funktionierte. Sie müssen die Binding explizit anweisen, nicht auf die DataContext zu schauen, sondern an der Steuerung selbst, die Eigenschaft zu finden, auf die in der Path verwiesen wird. RelativeSource={RelativeSource Self} macht das. "Background.Color" ist der Path Parameter für die Binding. Path ist der Standardwert, Sie müssen ihn also nicht explizit benennen. Aber du könntest:

<DataTrigger 
    Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" 
    Value="Red"> 
+0

Dank Ed Plunkett, Background.Color war der Trick! – RDV