Заставить ListBox не выбирать первый элемент после настройки ItemsSource - PullRequest
2 голосов
/ 23 июня 2011

Мне нравится заполнять Listbox с List<T> как ItemsControl.ItemsSource. Кажется, как только я установил ItemsSource, мой обработчик событий для SelectionChanged срабатывает, и мой первый элемент в списке выбран. Я хотел бы начать список с того, что по умолчанию ничего не выбрано, и мне не нужно пытаться обработать событие, пока пользователь фактически не нажмет на элемент списка.

Это во всплывающем окне, поэтому каждый раз, когда появляется список, он должен иметь значение «ничего не выбрано», т.е. SelectedIndex == -1.

Полагаю, я мог бы удалить обработчик событий в коде, заполнить список, установить его равным -1, а затем снова добавить обработчик событий, но это выглядит как грязный способ сделать это.

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Психическая отладка, у вас ListBox.IsSynchronizedWithCurrentItem установлено значение True в XAML?

Дано:

    <ListBox x:Name="TestListBox"
             IsSynchronizedWithCurrentItem="True"/>

И

    public MainWindow()
    {
        InitializeComponent();
        this.TestListBox.SelectionChanged += TestListBox_SelectionChanged;
        this.TestListBox.ItemsSource = Enumerable.Range(10, 10).ToList();
    }

    void TestListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        throw new NotImplementedException();
    }

Я получаю NotImplementException, что означает, что IsSynchronizedWithCurrentItem="True" является вероятным виновником.

Мы можем проверить гипотезу об этом, удалив этот атрибут или установив для него значение false, что не вызовет исключения, пока пользователь не щелкнет элемент.

0 голосов
/ 23 июня 2011

Другой способ - привязать список к общедоступному свойству с отдельным свойством для текущего элемента.

   <ListBox ItemsSource="{Binding Path=Images}" SelectedItem="{Binding CurrentItem}" />

private IndexedImage _currentItem;
public IndexedImage CurrentItem
{
    get { return _currentItem; }
    set
    {
        if (_currentItem == value) return;
        _currentItem = value;
        RaisePropertyChanged("CurrentItem");
    }
}

    private ObservableCollection<IndexedImage> _images;
    public ObservableCollection<IndexedImage> Images
    {
        get { return _images ?? (_images = new ObservableCollection<IndexedImage>()); }
        set
        {
            if (_images == value) return;
            _images = value;
            RaisePropertyChanged("Images");
        }
    }

CurrentItem полностью находится под вашим контролем. Когда вы начинаете, он нулевой, и он устанавливается, когда они щелкают элемент или вы устанавливаете его вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...