我有一个选中的列表框,我希望复选框是多选的,但列表项上的高亮条是单选。使用下面列出的代码,复选框是多选的,但列表框中没有高亮条,也无法从列表框中分辨出当前选择的项目。 (lbProtocols.SelectedItems始终为0)
我错过了什么?
以下是列表框的xaml:
<ListBox Name ="lbProtocols" ItemsSource="{Binding AvailableProtocols}">
<ListBox.ItemTemplate>
<HierarchicalDataTemplate>
<CheckBox Content="{Binding ProtocolName}" IsChecked="{Binding IsChecked}" />
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
</ListBox>
以下是将我的可观察集合绑定到列表框的代码:
public ObservableCollection<CheckedListItem> AvailableProtocols;
AvailableProtocols = new ObservableCollection<CheckedListItem>();
CheckedListItem item1 = new CheckedListItem(0, "first", false);
item1.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged);
CheckedListItem item2 = new CheckedListItem(1, "second", true);
item2.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged);
CheckedListItem item3 = new CheckedListItem(3, "third", false);
item3.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged);
AvailableProtocols.Add(item1);
AvailableProtocols.Add(item2);
AvailableProtocols.Add(item3);
lbProtocols.ItemsSource = AvailableProtocols;
这是CheckedListItem类:
public class CheckedListItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangedEventHandler IUPropertyChanged;
public CheckedListItem(){ }
public CheckedListItem(int id, string name, bool check)
{
ID = id;
ProtocolName = name;
IsChecked = check;
}
public int ID { get; set; }
public string ProtocolName { get; set; }
private bool _IsChecked;
public void SetCheckedNoNotify(bool check)
{
_IsChecked = check;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
}
public bool IsChecked
{
get { return _IsChecked; }
set
{
_IsChecked = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
if (IUPropertyChanged != null)
IUPropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
}
}
}
答案 0 :(得分:1)
在ListBoxItem中使用Checkbox时,您的问题很常见。该复选框正在处理单击事件,因此从不通知列表框您选择了该项目。如果您单击每个项目旁边文本的右侧,您将看到该行被选中。
我建议的最佳解决方案是你像这样分割你的DataTemplate
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" />
<TextBlock Text="{Binding ProtocolName}" />
</StackPanel>
</DataTemplate>
现在单击文本会选择列表框中的项目。如果你想要复选框单击以使项目被选中,你必须绑定到CodeChind中的复选框项的PropertyChanged,然后设置
lbProtocols.SelectedItem = sender