2016-09-19 5 views
0

У меня есть MVVM привязки для Border фона, где в я прочитал имена цвета из файла в формате Строка и конвертировать их в кисти с помощью кода:Кисть MVVM Binding не имеет дают по имени цвета

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 никогда не запускается, потому что, когда я вижу значение this._background в методе set, оно «# FFFF0000» и не равно Brushes.Red (я попытался преобразовать значение в SolidColorBrush, а затем сравнил с Brushes.Red, но он не равен).

Что я такое делаю неправильно? Что я могу сделать для того, чтобы имена цветов, которые я прочитал из файла, были правильно преобразованы в Brushes. *, Чтобы мой DataTrigger работал нормально.

Спасибо,

RDV

ответ

1

Да, Brushes.Red является SolidColorBrush. Не цвет, кисть. Путаница возникает из-за неявного преобразования строки «Красный» в XAML в объект Brush. Но новый экземпляр SolidColorBrush с Color, который также равен #FFFF0000, будет другим экземпляром 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" - параметр Path для Binding. Path по умолчанию, поэтому вам не нужно явно указывать его. Но вы могли бы:

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

Thanks Ed Plunkett, Background.Color был трюк! – RDV