带有 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
。
我正在关注 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
。