列表框项目触发颜色更改

时间:2015-10-29 09:46:47

标签: wpf xaml

我正在尝试根据使用MVVM的触发器更改列表框中项目的颜色

 <Border Grid.Row="1" Width="300" Margin="0,0,20,0" BorderThickness="1,2,1,1" CornerRadius="5" BorderBrush="#FF999393" Background="#FFE9EDF1" >
    <ListBox ItemsSource="{Binding LogMessageList, UpdateSourceTrigger=PropertyChanged}" Background="{x:Null}" Margin="3" BorderBrush="{x:Null}" FontSize="13.333" >
        <ListBox.ItemContainerStyle>
             <Style TargetType="ListBoxItem">
                  <Setter Property="Foreground" Value="#FF403E3E" />
                  <Style.Triggers>
                       <DataTrigger Binding="{Binding FatalError, UpdateSourceTrigger=PropertyChanged}"  Value="Fatal">
                        <Setter Property="Foreground" Value="Firebrick" />
                       </DataTrigger>
                  </Style.Triggers>
             </Style>
         </ListBox.ItemContainerStyle>                                                       
  </ListBox>

我正确设置了属性更改,但似乎没有任何改变。

由于

编辑: 仍然卡住了。尝试

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="Foreground" Value="#FF403E3E" />
           <Style.Triggers>
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.FatalError, UpdateSourceTrigger=PropertyChanged}"  Value="Fatal">
            <Setter Property="Foreground" Value="Firebrick" />
        </DataTrigger>
      </Style.Triggers>
   </Style>
</ListBox.ItemContainerStyle>

1 个答案:

答案 0 :(得分:0)

试过你的情景。请参考以下代码示例:

查看模型

public class Vm : INotifyPropertyChanged
{
    public ObservableCollection<VmUser> VmUsers { get; set; }

    private string errorType;

    public string ErrorType
    {
        get { return errorType; }
        set 
        {
             errorType = value;
             Raise("ErrorType");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public void Raise(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class VmUser
{
    public string Name { get; set; }

    public int Age { get; set; }
}

在构造函数中设置窗口的DataContext

    public MainWindow()
    {
        Vm = new Vm
        {
            VmUsers = new ObservableCollection<VmUser>
            {
                new VmUser { Name = "Gil", Age = 1 },
                new VmUser { Name = "Dan", Age = 2 },
                new VmUser { Name = "John", Age = 3 },
            },

            ErrorType = "Fatal"
        };
        InitializeComponent();
        DataContext = TheVm;
    }

在XAML中将ListBox定义为:

<ListBox Grid.Row="2" ItemsSource="{Binding VmUsers}" DisplayMemberPath="Name" SelectedValuePath="Age">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Foreground" Value="#FF403E3E" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.ErrorType, UpdateSourceTrigger=PropertyChanged}"  Value="Fatal">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

为了测试这个场景,我写了一个小测试来点击按钮

来切换ErrorType
private void Button_Click(object sender, RoutedEventArgs e)
{
    var vm = this.DataContext as Vm;
    if (vm != null)
    {
        if (vm.ErrorType  == "Fatal")
        {
            vm.ErrorType = "Non Fatal";
        }
        else
        {
            vm.ErrorType = "Fatal";
        }
    }
}

以上示例基于ErrorType更改前景色。