带有 CheckBox 数据模板的 WPF ListBox - Checkbox 的绑定内容 属性 不起作用

WPF ListBox with CheckBox data template - Binding Content property of Checkbox not working

我正在关注 Kelly Elias 关于 making a WPF checkListBox 的精彩文章。

但是,就我而言,我必须使用反射在代码中创建我的对象。 ListBox 项源正确填充,数据模板正确设置了 ListBox 的样式,从而生成了 CheckBox 列表,但没有显示 CheckBox 的内容。我的数据模板中的绑定有什么问题?

为简洁起见,请参阅上面的 link CheckedListItem class;我的没变。

费用 class,其中我们将输入 CheckedListItem:

public class Charge
{
    public int ChargeId;
    public int ParticipantId;
    public int Count;
    public string ChargeSectionCode;
    public string ChargeSectionNumber;
    public string ChargeSectionDescription;
    public DateTime OffenseDate;
}

XAML中的DataTemplate:

<UserControl.Resources>
    <DataTemplate x:Key="checkedListBoxTemplate">
        <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Path=Item.ChargeSectionNumber}" />
    </DataTemplate>
</UserControl.Resources>

后面的代码:

CaseParticipant participant = _caseParticipants.Where(q => q.ParticipantRole == content.SeedDataWherePath).FirstOrDefault();
ObservableCollection<CheckedListItem<Charge>> Charges = new ObservableCollection<CheckedListItem<Charge>>();

if (participant != null)
{
    foreach (Charge charge in participant.Charges)
    {
        Charges.Add(new CheckedListItem<Charge>(charge));
    }

    ((ListBox)control).DataContext = Charges;
    Binding b = new Binding() { Source = Charges };

    ((ListBox)control).SetBinding(ListBox.ItemsSourceProperty, b);
    ((ListBox)control).ItemTemplate = (DataTemplate)Resources["checkedListBoxTemplate"];
}

结果

基础费用的 ChargeSectionNumber 属性 的值为“11418(b)(1)”、“10”、“11”和“13”。

感谢您的协助!

进行 DataBinding 时,您的 class 需要实施 INotifyPropertyChanged 以便数据在 UI 中正确显示。一个例子:

public class Charge : INotifyPropertyChanged
{

  private string chargeSectionNumber;
  public string ChargeSectionNumber
  {
    get
    {
      return chargeSectionNumber;
    }
    set
    {
      if (value != chargeSectionNumber)
      {
        chargeSectionNumber = value;
        NotifyPropertyChanged("ChargeSectionNumber");
      }
    }
  }

  private void NotifyPropertyChanged(string info)
  {
    if (PropertyChanged != null)
    {
      PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

这显示了 class、一个 属性 (ChargeSectionNumber) 以及实现 INotifyPropertyChanged.

所需的事件和方法

在您在问题中引用的示例中,您可以看到绑定到的 class 也实现了 INotifyPropertyChanged