2015-08-31 3 views
0

Я хотел бы изменить цвет моего Label в представлении, основанном на типе в моей модели ViewModel. Для экс:Изменение свойства элемента вида на основе изменения свойства ViewModel

Мой класс в ViewModel имеет bool свойство, как следующее:

MyViewModel 
{ 
public bool IsBlueColor {get; set;} //Here I will raise the `PropertyChanged` 
} 

Как я могу обернуть триггер для этого значения, чтобы обновить Foreground свойство моего лейбла. Все, что я мог выяснить, это изменение свойства элемента пользовательского интерфейса на основе его свойства с использованием DataTrigger. Но не на основе viewmodel.

Как я могу достичь этого в xaml?

Прямо сейчас я делаю это:

<Label.Style> 
    <Style TargetType="Label" BasedOn="{StaticResource LabelStyle}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsBlueColor, RelativeSource={RelativeSource AncestorType={x:Type local2:MyViewModel}}}" Value="True"> 
       <Setter Property="Foreground" Value="RoyalBlue"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=IsBlueColor, RelativeSource={RelativeSource AncestorType={x:Type local2:MyViewModel}}}" Value="False"> 
       <Setter Property="Foreground" Value="White"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Label.Style> 
+0

Причина, по которой это не работает, связано с тем, что привязки RelativeSource привязаны относительно самого элемента управления, а не контекста данных управления. Ваша привязка пытается найти родительский элемент управления типа MyViewModel, который, очевидно, не будет работать, потому что ваша модель представления не является элементом управления. Ответ Никиты верен, или если ваша модель представления задана как контекст данных вашего главного окна, вы можете использовать RelativeSource с типом окна и путем DataContext.IsBlueColor. –

ответ

2

Изменить стиль триггеров:

<Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsBlueColor}" Value="True"> 
       <Setter Property="Foreground" Value="RoyalBlue"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=IsBlueColor}" Value="False"> 
       <Setter Property="Foreground" Value="White"/> 
      </DataTrigger> 
</Style.Triggers> 

Проверка реализации INotifyPropertyChanged в ViewModel.

это работает в образце для меня.

Пример:

class LabelViewModel:INPC 
{ 
public event PropertyChangedEventHandler PropertyChanged=new delegate{}; 
bool _isBlueColor; 
public bool IsBlueColor 
{ 
    get 
    { 
    return _isBlueColor; 
    } 
    set 
    { 
    _isBlueColor=value; 
    OnPropertyChange(); 
    } 
} 
public OnPropertyChange([CallerMemberName] string propname="") 
{ 
    PropertyChanged.Invoke(this,ew PropertyChangedEventArgs(propname)); 
} 

} 

Создать экземпляр LabelViewModel (labelVM) & назначить label1.DataContext = labelVM;

+0

Спасибо, что ответили. К сожалению, это не сработает. Какая должна быть обертка стиля на этом? В настоящее время мой целевой тип - это «Ярлык», поэтому у него не будет свойства IsBlueColor. –

+0

TargetType будет самой Label, IsBlueColor должен быть свойством ViewModel, который предоставляется как dataContext для данной метки. триггер представляет собой «Когда свойство IsBlueColor является истинным в ViewModel, задайте свойство переднего плана метки как RoyalBlue». –

+0

Проверьте обновленный ответ, я добавил пример кода. –

Смежные вопросы