【问题标题】:Binding ListViewItem Background to boolean将 ListViewItem 背景绑定到布尔值
【发布时间】:2013-08-30 05:04:15
【问题描述】:

可能是一个简单的,但我似乎无法让它工作,这是列表视图和绑定的 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:在那张纸条上,事实证明我使用的是自定义列表; “线程绑定列表”。它可能不会从 OnNotify 更新..所以我将不得不尝试解决这个问题。

【问题讨论】:

    标签: c# wpf triggers styles


    【解决方案1】:

    您需要为属性LastTransmitted 提高PropertyChangedEvent,以便通知 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>
    

    【讨论】:

    • 我希望你能看到我的视图模型的其余部分,我每次都会提高属性更改。每次,但这次,真是个愚蠢的错误 XD,说我已经添加了更改的属性,但似乎仍然没有发生任何事情。
    • 恐怕还是无济于事。我正在尝试将样式应用于文本块,应该以不同的方式完成吗?作为样式定位目标 ListViewItem
    • @Shane.C 我改变了我的答案。看看吧。
    • 只要我将线程列表类型更改为并发包并在添加项目时处理手动刷新,就会产生魅力。谢谢:)
    【解决方案2】:

    除非您告诉 XAML,否则 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 ) );
        }
    }
    

    【讨论】:

    • 我只是忘了添加 propertyChanged 事件,但是在这样做之后我仍然看不到任何结果!我已经更新了我的代码
    • 如何设置DataContext?因为您使用了ItemsSource="{Binding Path=MainWindowViewModel.TrackerCollection}",所以我假设您的DataContext 设置为包含一个名为MainWindowViewModel 的属性,该属性具有一个名为TrackerCollection 的集合属性,其中充满了TrackerViewModels。确保这一切都正确。
    • 是的,这一切都是正确的。我确定绑定有效,因为文本块内容设置为同一个 DataContext 中的绑定,并且工作正常。如果我取出触发器并只使用设置器,它会按预期改变颜色,而不是数据触发器。我还可以使用 OnPropertyChanged 验证属性更改是否触发。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2010-12-23
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多