2016-09-19 4 views
0

を与えるものではありませんバインディング:ブラシMVVMで、私は文字列の形式のファイルからの色の名前を読んで、コードを使用してブラシにそれらを変換ところ、私はMVVMはボーダー背景で結合しているという名前の色

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

背景でありますプロパティとしてのViewModelで定義されている:

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

そして、それは次のようにXAMLでアクセスされます。

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

ボーダーは適切に色付けされています。問題はありません。

問題はDataTriggerは決してトリガーされません。setメソッドのthis._backgroundの値を見ると "#FFFF0000"で、Brushes.Redと等しくないためです(値をSolidColorBrushに変換して比較しようとしましたブラシで.Red、それは等しくない)。

私は間違っていますか?ファイルから読み込んだ色の名前がBrushes。*に正しく変換されていることを確認するために何ができるのですか?DataTriggerがうまく動作するように。

おかげで、

RDV

答えて

1

はい、Brushes.RedSolidColorBrushです。色、ブラシではありません。混乱は、XAMLの文字列 "Red"をBrushオブジェクトに暗黙的に変換することによって発生します。しかし、新しいSolidColorBrushのインスタンスColor#FFFF0000と等しい場合は、SolidColorBrushの異なるインスタンスになり、互いに「等しくない」ことになります。

しかし、それがどのブラシインスタンスかは気にしません。あなたは色を気にします。それで色を比較してください。 (Brushes.Red.Color == Colors.Red) == trueColorは参照型ではない値型なので、2つの同等のは等しいと見なされます。

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

BackgroundDataContextの財産ではないことに注意してください。それはあなたのコードではうまくいきませんでした。 Bindingには、DataContextではなく、コントロール自体で、Pathで参照されているプロパティを検索するよう明示する必要があります。 RelativeSource={RelativeSource Self}です。 "Background.Color"BindingPathパラメータです。 Pathがデフォルトであるため、明示的に名前を付ける必要はありません。しかし、あなたはできる:

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

ありがとうEd Plunkett、Background.Colorはトリックでした! – RDV

関連する問題