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。在这种情况下,第一项可能是不可移植的。