将ListViewItem背景绑定到布尔值

时间:2013-08-27 12:35:55

标签: c# wpf triggers styles

可能是一个简单的但我似乎无法使其工作,这里是listview和绑定的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,我假设它会触发样式进行处理;

  _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更新。所以我将不得不尝试解决这个问题。

3 个答案:

答案 0 :(得分:2)

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

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

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

<强>更新

当我理解你的时候,你希望TextBlock属性发生变化时LastTransmitted的背景会发生变化。 TextBlock本身没有Background-Property,因此您必须将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>

答案 1 :(得分:0)

尝试在视图模型上实现INotifyPropertyChanged接口...您正在设置属性值,但框架未通知UI。

您可以从MSDN的How to: Implement Property Change Notification页面了解如何执行此操作。

答案 2 :(得分:0)

除非您说明,否则XAML不知道您已更新了该值。您需要property change notification

让您的类实现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 ) );
    }
}