Нет выделенных элементов в моем Checked ListBox - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть флажок со списком, и я хотел бы, чтобы флажки были множественными, но полоса выделения на элементах списка была бы одиночной. С кодом, указанным ниже, флажки являются множественными, но в списке нет выделенной строки, и я не могу сказать из списка, какой элемент выбран в данный момент. (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 Ответ

1 голос
/ 16 декабря 2011

Ваша проблема является распространенной при использовании флажков в ListBoxItem.Флажок обрабатывает событие click, поэтому список никогда не уведомляется о том, что вы выбрали элемент.Если вы щелкнете справа от текста рядом с каждым элементом, вы увидите, что строка становится выделенной.

Лучшее решение, которое я могу предложить, - разделить ваш DataTemplate следующим образом:

<DataTemplate>
                    <StackPanel Orientation="Horizontal">
                    <CheckBox  IsChecked="{Binding IsChecked}"  />
                    <TextBlock Text="{Binding ProtocolName}" />
                    </StackPanel>
                </DataTemplate>
* 1005.* Теперь, щелкнув текст, выберите элемент в списке.Если вы хотите, чтобы флажок был установлен, чтобы элемент стал выбранным, вам нужно будет привязать его к PropertyChanged для элемента флажка в codebehind, а затем установить
lbProtocols.SelectedItem = sender
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...