可能是一个简单的但我似乎无法使其工作,这里是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更新。所以我将不得不尝试解决这个问题。
答案 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放入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>
答案 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 ) );
}
}