如何在基础对象状态更改时触发 ListBoxItem 的样式更改?
How to trigger a ListBoxItem's style change on the underlying object state change?
我有一个 ListBox
的基本设置,其 ItemSource
属性 设置为 ObservableCollection<Human>
。
<ListBox ItemsSource="{Humans}" DisplayMemberPath="Name">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<!-- Some setters -->
</Style>
</ListBox>
Human
定义如下:
public class Human
{
public string Name { get; set; }
public bool IsAnswered { get; set; }
public override string ToString() => this.Name;
}
所以我们有一个 Human
对象作为每个列表框项目的来源,以及显示其字符串表示的默认行为(在本例中为 Name
属性) .
现在,当 IsAnswered
更改为 true
时,我希望将显示的 Human.Name
值格式化为粗体。如何实现?
项目容器的 DataContext
始终是数据模型,在您的例子中是 Human
实例。因此只需绑定到 DataContext
:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding IsAnswered}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
如评论中所述,您必须让 Human
实施 INotifyPropertyChanged
。 属性 IsAnswered
必须引发 INotifyPropertyChanged.PropertyChanged
事件。否则 属性 的更改将不会传播。
我有一个 ListBox
的基本设置,其 ItemSource
属性 设置为 ObservableCollection<Human>
。
<ListBox ItemsSource="{Humans}" DisplayMemberPath="Name">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<!-- Some setters -->
</Style>
</ListBox>
Human
定义如下:
public class Human
{
public string Name { get; set; }
public bool IsAnswered { get; set; }
public override string ToString() => this.Name;
}
所以我们有一个 Human
对象作为每个列表框项目的来源,以及显示其字符串表示的默认行为(在本例中为 Name
属性) .
现在,当 IsAnswered
更改为 true
时,我希望将显示的 Human.Name
值格式化为粗体。如何实现?
项目容器的 DataContext
始终是数据模型,在您的例子中是 Human
实例。因此只需绑定到 DataContext
:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding IsAnswered}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
如评论中所述,您必须让 Human
实施 INotifyPropertyChanged
。 属性 IsAnswered
必须引发 INotifyPropertyChanged.PropertyChanged
事件。否则 属性 的更改将不会传播。