WPF Listview SelectionChanged事件
我有一个WPF Listview SelectionChanged事件,wpf,listview,selectionchanged,Wpf,Listview,Selectionchanged,我有一个ListView绑定到ItemsSource并且SelectionChanged事件正在加载/数据绑定事件时触发?我假设这是因为选择了“默认”项,即索引0 如何禁用此功能 如果仅设置ItemsSource属性,则listView不应触发SelectionChange。但是,如果将SelectedIndex属性绑定到dataContext对象的属性,则所选内容将移动到绑定属性指定的索引 当页面加载时,这不会触发Selector_OnSelectionChanged事件: <ListV
ListView
绑定到ItemsSource
并且SelectionChanged
事件正在加载/数据绑定事件时触发?我假设这是因为选择了“默认”项,即索引0
如何禁用此功能 如果仅设置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的
为了避免这种情况并在标记中保留绑定,请在绑定之前(在表单构造函数中调用InitializeComponent()之前)将dataContext对象的SelectedIndexValue设置为-1
希望这能有所帮助。感谢您的回复 当我在SelectionChanged事件上设置断点时,它会在屏幕完全加载之前中断进程。您还将看到列表中的第一行随后被“选中”。正如您在代码中看到的,我没有绑定到SelectedIndex值。列表的DataContext是只读集合 在您可以看到的my SelectionChanged事件中,我通知其他对象加载与所选项目相关的数据。我只希望在选择一个而不是设置默认值时发生这种情况。我必须选择其中一个表示类似数据的ListView,但在加载时,任何ListView都不能选择任何项 我注意到,在Listview的properties窗口中,默认选中的索引设置为-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);
}
private void ActiveCasesView\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
如果(鼠标单击)
如果(e.AddedItems.Count>0)
App.Messenger.notify同事(App.MSG\u SELECT\u ACTIVE\u CASE,((CaseViewModel)ActiveCasesView.SelectedItem.CaseNumber);
}
我添加了PreviewMouseDown以设置我在SelectionChanged事件中单击listview的指示器。这确实有帮助,但我不相信这是最好的解决方案
谢谢
Petrus您可以尝试在绑定中将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集合的类型是什么 您可以使用窗口加载事件来阻止该操作
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 ....
}
我不知道您是否还需要帮助,但我通过创建一个跟踪selectedindex的变量解决了这个问题,在我的例子中——最初绑定时,它始终为0,因此对我来说,这样做比较容易,但是如果您通知viewmodel相应的索引,我只添加了一个
ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex
嗨,佩特罗斯。您可以分享您的代码吗?我正在绑定到自定义ViewModel的ReadonlyCollection。在这种情况下,第一项可能是不可移植的。