我喜欢使用Listbox
作为List<T>
填充ItemsControl.ItemsSource
。似乎只要我设置了ItemsSource
SelectionChanged
的{{1}}事件处理程序,就会选中列表中的第一个项目。我想在没有默认选择的情况下启动列表,并且在用户实际点击列表成员之前不必尝试处理该事件。
这是在PopUp窗口中,因此每次出现列表时,都应将其设置为“未选择”,即SelectedIndex == -1
。
我想我可以删除代码中的事件处理程序,填充列表,将其设置为-1,然后再次添加事件处理程序,但这似乎是一种混乱的方式。
答案 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并且当它们点击一个项目或你手动设置它时它被设置。