2013-08-27 84 views
1

可能是一个简单的但我似乎无法得到它的工作,这里是列表视图和绑定的XAML;绑定ListViewItem布尔型背景

<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”,只是incase。

编辑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> 

然后textblocks都是蓝色的,如布尔值被设置为true所示。但是,如果设置为true,并且通知了属性,则不会更改。也许这个清单不是很好的清爽?我确定它与ObservableCollection相关联。编辑2:并在那个笔记,事实证明我使用自定义列表; “ThreadedBindingList”。它可能不会从OnNotify更新..所以我不得不尝试解决这个问题。

回答

2

您需要提高PropertyChangedEvent的属性LastTransmitted,以便通知用户界面该属性已更改并且您的触发器已执行。

由于您从ViewModelBase继承了班级,我假设该班级实施了INotifyPropertyChanged并提供了一种提升活动的方法。

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

UPDATE:

当我明白你的权利,你想要的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> 
+0

我希望你能看到我的viewmodel的其余部分,我字面上每次提高属性更改。每一次,但这次,XD是多么愚蠢的错误,说我已经添加了属性发生了变化,而且似乎还没有发生。 –

+0

仍然没有用,我很害怕。我试图将样式应用于文本块,应该以不同的方式完成吗?作为风格的目标目标ListViewItem –

+0

@ Shane.C我改变了我的答案。看看它。 – Jehof

0

XAML不知道您已经更新了该值,除非您告诉它。您需要property change notification

让您的班级执行INotifyPropertyChanged并定义PropertyChanged事件处理程序。然后,无论何时您需要关注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)); 
    } 
} 
+0

Jehof第一次进来,他应该得到信用;-) – josh2112

+0

我只是忘了添加propertyChanged事件,但在这样做后,我仍然没有看到任何结果!我已更新我的代码 –

+0

如何设置DataContext?因为您已经使用了'ItemsSource =“{Binding Path = MainWindowViewModel.TrackerCollection}”',我假设您的DataContext被设置为包含名为'MainWindowViewModel'的属性,该属性具有名为'TrackerCollection'的集合属性, TrackerViewModel's。确保这一切都是正确的。 – josh2112