WPF Listview SelectionChanged事件

时间:2009-09-02 13:22:29

标签: wpf listview selectionchanged

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

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

由于 Petrus的

5 个答案:

答案 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 ....

}