将ListViewItem背景绑定到布尔值

本文关键字:布尔值 绑定 背景 ListViewItem | 更新日期: 2023-09-27 18:29:06

可能很简单,但我似乎无法让它工作,这是列表视图和绑定的XAML;

<ListView 
   VerticalAlignment="Stretch" 
   HorizontalAlignment="Stretch" 
   x:Name="lstTrackers" 
   ItemsSource="{Binding Path=MainWindowViewModel.TrackerCollection}" 
   HorizontalContentAlignment="Stretch">
   <ListView.ItemContainerStyle>
      <Style TargetType="{x:Type ListViewItem}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True">
               <Setter Property="Background" Value="Green"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False">
               <Setter Property="Background" Value="White"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </ListView.ItemContainerStyle>
   <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock 
            Text="{Binding Path=Description}" 
            x:Name="listTextClick" 
            MouseLeftButtonUp="listTextClick_MouseLeftButtonUp" 
            HorizontalAlignment="Stretch"/>
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

以及我试图将其绑定到的属性;

 public class TrackerViewModel : ViewModelBase
    {
        readonly Tracker _tracker;
        public TrackerViewModel(Tracker tracker)
        {
            _tracker = tracker;
        }
        public bool LastTransmitted
    {
        get
        {
            return _tracker.lastTransmitted;
        }
        set
        {
            _tracker.lastTransmitted = value;
            OnPropertyChanged("LastTransmitted");
        }
    }
    }

然后我只是尝试将布尔值设置为true,我认为这会触发样式proc;

  _trackerViewModel.LastTransmitted = true;

然而,似乎什么都没发生。是不是有一些简单而又必要的东西让我错过了?

注意:我已经试过将"true"改为"true",只是以防万一。

编辑1:更改似乎没有得到通知,这很奇怪,因为我确信是的。如果我将触发器更改为;

<Style x:Key="listBoxStyle" TargetType="{x:Type TextBlock}">
                                                    <Style.Triggers>
                                                        <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True">
                                                            <Setter Property="Background" Value="Green"/>
                                                        </DataTrigger>
                                                        <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False">
                                                        <Setter Property="Background" Value="Blue" ></Setter>
                                                    </DataTrigger>
                                                    </Style.Triggers>
                                                    <!--<Setter Property="Background" Value="Red"/>-->
                                                </Style>

然后文本块都是蓝色的,如布尔值设置为true所示。但是,如果将其设置为true并通知属性,则不会发生任何更改。也许列表刷新不正确?我确信它与ObservableCollection有关。

编辑2:在这一点上,我使用了一个自定义列表;"ThreadedBindingList"。它可能不是从OnNotify更新的。。所以我得试着解决这个问题。

将ListViewItem背景绑定到布尔值

您需要为属性LastTransmitted引发PropertyChangedEvent,以便UI收到属性已更改的通知,并执行触发器。

由于您从ViewModelBase继承了类,我假设该类实现了INotifyPropertyChanged并提供了引发事件的方法。

public bool LastTransmitted {
  get {
    return _tracker.lastTransmitted;
  }
  set {
    _tracker.lastTransmitted = value;
    RaisePropertyChanged("LastTransmitted");
  }
}

更新:

当我理解正确时,您希望TextBlock的背景在LastTransmitted属性更改时发生更改。TextBlock本身没有Background属性,因此必须将TextBlock放入类似GridStackPanel的容器中。

这是您的ListBox的DataTemplate,它可以满足您的需要。

<DataTemplate>
  <StackPanel>
    <StackPanel.Style>
      <Style TargetType="StackPanel">
        <Style.Triggers>
          <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True">
            <Setter Property="Background" Value="Green" />
          </DataTrigger>
          <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False">
            <Setter Property="Background" Value="White" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </StackPanel.Style>
    <TextBlock HorizontalAlignment="Stretch" Text="{Binding Path=Description}" />
  </StackPanel>
</DataTemplate>

尝试在视图模型上实现INotifyPropertyChanged接口。。。您正在设置属性值,但Framework不会通知UI。

您可以从MSDN上的how to:Implement Property Change Notification页面了解如何做到这一点。

XAML不知道你已经更新了值,除非你告诉它。你需要属性更改通知

让您的类实现INotifyPropertyChanged并定义PropertyChanged事件处理程序。然后,每当您set XAML应该关心的东西时,使用您更改的属性的名称触发一个PropertyChanged事件。

public class TrackerViewModel : ViewModelBase, INotifyPropertyChanged
{
    readonly Tracker _tracker;
    public TrackerViewModel( Tracker tracker )
    {
        _tracker = tracker;
    }
    public bool LastTransmitted
    {
        get
        {
            return _tracker.lastTransmitted;
        }
        set
        {
            _tracker.lastTransmitted = value;
            OnPropertyChanged( "LastTransmitted" );
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged( string name )
    {
        var handler = PropertyChanged;
        if( handler != null ) handler( this, new PropertyChangedEventArgs( name ) );
    }
}