我的Checked ListBox中没有突出显示的项目

时间:2011-12-16 17:01:18

标签: c# wpf xaml

我有一个选中的列表框,我希望复选框是多选的,但列表项上的高亮条是单选。使用下面列出的代码,复选框是多选的,但列表框中没有高亮条,也无法从列表框中分辨出当前选择的项目。 (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"));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在ListBoxItem中使用Checkbox时,您的问题很常见。该复选框正在处理单击事件,因此从不通知列表框您选择了该项目。如果您单击每个项目旁边文本的右侧,您将看到该行被选中。

我建议的最佳解决方案是你像这样分割你的DataTemplate

<DataTemplate>
                    <StackPanel Orientation="Horizontal">
                    <CheckBox  IsChecked="{Binding IsChecked}"  />
                    <TextBlock Text="{Binding ProtocolName}" />
                    </StackPanel>
                </DataTemplate>

现在单击文本会选择列表框中的项目。如果你想要复选框单击以使项目被选中,你必须绑定到CodeChind中的复选框项的PropertyChanged,然后设置

lbProtocols.SelectedItem = sender