WPF Listview SelectionChanged事件

Pet*_*rus 11 wpf listview selectionchanged

我有一个ListView绑定ItemsSource.为什么SelectionChanged事件在load/databound事件上触发?我认为这是因为选择了'默认'项目,即索引0.

如何禁用此功能,因为选择项目时会更新其他数据源.

谢谢Petrus

Cla*_*ila 5

如果仅设置ItemsSource属性,则listView不应触发SelectionChange。但是,如果将SelectedIndex属性绑定到dataContext对象的属性,则所选内容将移动到由binded属性指定的索引。

当页面加载时,这不会触发Selector_OnSelectionChanged事件:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>
Run Code Online (Sandbox Code Playgroud)

但是这样做:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  SelectedIndex="{Binding Path=SelectedIndexValue}"
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>
Run Code Online (Sandbox Code Playgroud)

因为通过绑定将SelectedIndex设置为SelecteIndexValue。

为了避免这种情况,并且仍将绑定保留在标记中,请在绑定之前(在表单构造函数中调用InitializeComponent()之前)将dataContext对象的SelectedIndexValue设置为-1。

希望这可以帮助。


Pet*_*rus 1

感谢您的回复。

当我在 SelectionChanged 事件上放置断点时,它会在屏幕完全加载之前中断进程。您还将看到列表中的第一行随后被“选中”。正如您在代码中看到的那样,我没有绑定到 SelectedIndexValue。列表的 DataContext 是 ReadonlyCollection

在我的 SelectionChanged 事件中,如您所见,我通知其他对象加载与所选项目相关的数据。我只希望在选择一个而不是设置默认值时发生这种情况。我必须使用这些代表类似数据的 ListView,但在加载时都必须选择一个项目。

我注意到列表视图的属性窗口中的默认选定索引设置为 -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);
    }
Run Code Online (Sandbox Code Playgroud)

我添加了 PreviewMouseDown 来设置一个指示器,指示我已单击 SelectionChanged 事件中的列表视图。这确实有帮助,但我不相信这是最好的解决方案。

谢谢帕特鲁斯