1

可能是一个简单的,但我似乎无法让它工作,这是列表视图和绑定的 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 并通知属性时,没有任何变化。也许列表没有正确刷新?我确定它与 ObservableCollection 相关联。

编辑2:在那张纸条上,事实证明我正在使用自定义列表;“线程绑定列表”。它可能不会从 OnNotify 更新..所以我将不得不尝试解决这个问题。

4

3 回答 3

2

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

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

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

更新:

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

这是您想要的 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>
于 2013-08-27T12:42:37.200 回答
0

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

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

于 2013-08-27T12:43:22.340 回答
0

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 ) );
    }
}
于 2013-08-27T12:48:08.627 回答