根据ViewModel属性更改更改视图元素属性

时间:2015-08-31 08:40:08

标签: c# wpf mvvm datatrigger

我想根据ViewModel中的类型更改视图中Label的颜色。例如:

我在ViewModel中的类有一个bool属性,如下所示:

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

如何为此值包装触发器以更新标签的Foreground属性。我能想到的只是使用DataTrigger基于其on属性更改UI元素的属性。但不是基于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>

1 个答案:

答案 0 :(得分: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>

检查ViewModel中的INotifyPropertyChanged的实现。

这适用于我的样本。

示例:

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)的实例&amp;分配给label1.DataContext = labelVM;