我与ListView
绑定ItemsSource
。
为什么SelectionChanged
事件会在load / databound事件上触发?我认为这是因为选择了'默认'项目,即索引0。
如何禁用此功能,因为选择项目时会更新其他数据源。
由于 Petrus的
答案 0 :(得分:4)
如果只设置ItemsSource属性,则listView不应触发SelectionChange。但是,如果将SelectedIndex属性绑定到dataContext对象的属性,则选择将移动到由绑定属性指定的索引。
当页面加载时,它不会触发Selector_OnSelectionChanged事件:
<ListView SelectionChanged="Selector_OnSelectionChanged"
ItemsSource="{Binding Path=Items}"
></ListView>
但这样做:
<ListView SelectionChanged="Selector_OnSelectionChanged"
SelectedIndex="{Binding Path=SelectedIndexValue}"
ItemsSource="{Binding Path=Items}"
></ListView>
因为SelectedIndex通过绑定设置为SelecteIndexValue。
为了避免这种情况并且仍然在标记中保留绑定,请在绑定之前将dataContext对象的SelectedIndexValue设置为-1(在表单构造函数中调用InitializeComponent()之前)。
希望这有帮助。
答案 1 :(得分:1)
感谢您的回复。
当我在SelectionChanged事件上放置一个断点时,它会在屏幕完全加载之前中断程序。您还会看到列表后面的第一行被“选中”。我没有绑定到SelectedIndexValue,你可以在代码中看到。列表的DataContext是ReadonlyCollection
在我的SelectionChanged事件中,您可以看到我通知其他对象要加载与所选项目相关的数据。我只希望在选择一个但不是默认设置时发生这种情况。我必须使用表示类似数据的这些ListView,但是在加载时,必须选择一个项目。
我注意到Listview的属性窗口中的默认Selected索引设置为-1。我甚至可以设置这是List_Loaded事件的代码,但到那时第一个SelectionChanged已经发生了。
<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
DataContext="{StaticResource ActiveCasesViewSource}"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource CasesItemTemplate}"
SelectionMode="Single"
SelectionChanged="ActiveCasesView_SelectionChanged"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto" >
</ListView>
private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (mouseClicked)
if (e.AddedItems.Count > 0)
App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber);
}
我添加了PreviewMouseDown来设置我在SelectionChanged事件中点击listview的指标。这确实有帮助,但我不相信它是最好的解决方案。
由于 Petrus的
答案 2 :(得分:1)
我不知道你是否还需要这方面的帮助,但我通过制作一个跟踪selectedindex的变量解决了这个问题,在我的情况下 - 最初绑定它时总是为0所以这对我来说更容易但是,如果您通知viewmodel相应的索引,我只需添加一个
ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex
答案 3 :(得分:0)
您可以尝试在绑定中将SelectedIndex属性设置为-1,但这也不是一个优雅的解决方案。
<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
DataContext="{StaticResource ActiveCasesViewSource}"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource CasesItemTemplate}"
SelectionMode="Single"
SelectionChanged="ActiveCasesView_SelectionChanged"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
**SelectedIndex="-1"**>
</ListView>
我试图重现你的行为,但没有成功。 您绑定的ItemsSource集合的类型是什么?
答案 4 :(得分:0)
您可以使用窗口加载事件来阻止操作
bool loaded = false;
window.Loaded += new RoutedEventHandler(MainWindow_Loaded);
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
windowLoaded = true;
}
private void ActiveCasesView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if(!loaded)
return ;
//do actions here ....
}