2011-06-22 40 views
2

后一个ListBox没有选择第一项我想填充ListboxList<T>ItemsControl.ItemsSource。似乎只要我设置ItemsSource,我的事件处理程序SelectionChanged就会触发,并且我的第一个项目在列表中被选中。我想从默认情况下没有选择任何内容开始列表,并且不必在用户实际点击列表中的成员之前尝试处理该事件。进行设置的ItemsSource

这是在弹出窗口中,所以每个显示的列表中时,它应该被设置为“没有选择”,即SelectedIndex == -1

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

+1

你的'ListBox.ItemsSource'设置在构造函数中吗? – user7116

回答

3

心理调试,你有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(); 
    } 

我receieve一个NotImplementException,这意味着IsSynchronizedWithCurrentItem="True"是一个可能的罪魁祸首。

我们可以通过删除该属性或将其设置为false,直到用户点击一个项目,这将不会抛出异常测试假设这一点。

+0

为什么这意味着IsSynchronizedWithCurrentItem是罪魁祸首?当它被设置为False时,你没有得到异常吗? –

+0

@亨克:对不起,当'false'或'null'我没有收到异常。 – user7116

+0

删除IsSync'd似乎在伎俩,谢谢!摆脱了一堆“正在初始化......”垃圾引导。肯 – Ken

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完全在您的控制之下。当你开始时它是空的,当它们点击一个项目或者你手动设置时它被设置。

相关问题