如何在基础对象状态更改时触发 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 事件。否则 属性 的更改将不会传播。