在设置ItemsSource后,使ListBox不选择第一个项目

时间:2011-06-22 20:41:21

标签: c# wpf listbox

我喜欢使用Listbox作为List<T>填充ItemsControl.ItemsSource。似乎只要我设置了ItemsSource SelectionChanged的{​​{1}}事件处理程序,就会选中列表中的第一个项目。我想在没有默认选择的情况下启动列表,并且在用户实际点击列表成员之前不必尝试处理该事件。

这是在PopUp窗口中,因此每次出现列表时,都应将其设置为“未选择”,即SelectedIndex == -1

我想我可以删除代码中的事件处理程序,填充列表,将其设置为-1,然后再次添加事件处理程序,但这似乎是一种混乱的方式。

2 个答案:

答案 0 :(得分:3)

心理调试,您是否在XAML中将ListBox.IsSynchronizedWithCurrentItem设置为True

假设:

    <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来测试假设,在用户点击某个项目之前不会引发异常。

答案 1 :(得分:0)

另一种方法是将列表绑定到公共属性,并为当前项使用单独的属性。

   <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完全在你的控制之下。当你启动它时它是null并且当它们点击一个项目或你手动设置它时它被设置。