簡體   English   中英

刷 MVVM 綁定不給命名顏色

[英]Brush MVVM Binding does not give named color

我有一個用於邊框背景的 MVVM 綁定,其中我從字符串格式的文件中讀取顏色名稱,並使用代碼將它們轉換為 Brush:

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,然后與 Brushes.Red 進行比較,但不相等)。

我做錯了什么? 我該怎么做才能確保我從文件中讀取的顏色名稱正確轉換為 Brushes.*,以便我的 DataTrigger 正常工作。

謝謝,

RDV

是的, Brushes.RedSolidColorBrush 不是顏色,是畫筆。 混淆源於將 XAML 中的字符串“Red”隱式轉換為 Brush 對象。 但是一個Color也等於#FFFF0000的新SolidColorBrush實例將是SolidColorBrush的不同實例,它們不會彼此“相等”。

但是你並不關心它是哪個筆刷實例; 你關心顏色。 所以比較一下顏色。 (Brushes.Red.Color == Colors.Red) == true Color是值類型,而不是引用類型,因此兩個等效將被視為相等。

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

請注意, Background不是DataContext的屬性。 這是第二件不適用於您的代碼的事情。 您需要明確告訴Binding不是查看DataContext ,而是查看控件本身,以查找Path引用的屬性。 RelativeSource={RelativeSource Self}這樣做的。 "Background.Color"BindingPath參數。 Path是默認值,因此您不必顯式命名它。 但你可以:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM