将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更新的。。所以我得试着解决这个问题。
您需要为属性LastTransmitted
引发PropertyChangedEvent
,以便UI收到属性已更改的通知,并执行触发器。
由于您从ViewModelBase
继承了类,我假设该类实现了INotifyPropertyChanged
并提供了引发事件的方法。
public bool LastTransmitted {
get {
return _tracker.lastTransmitted;
}
set {
_tracker.lastTransmitted = value;
RaisePropertyChanged("LastTransmitted");
}
}
更新:
当我理解正确时,您希望TextBlock
的背景在LastTransmitted
属性更改时发生更改。TextBlock本身没有Background属性,因此必须将TextBlock放入类似Grid
或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>
尝试在视图模型上实现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 ) );
}
}