14

我有一个ListView绑定,ItemsSource并且SelectionChanged事件在加载/数据绑定事件上触发?我认为这是因为选择了“默认”项目,即索引 0。

我怎样才能禁用它?

4

5 回答 5

7

如果您只设置 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() 之前)。

希望这可以帮助。

于 2009-09-02T23:29:32.637 回答
1

感谢您的回复。

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

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

我注意到 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 事件中单击列表视图的指示器。这确实有帮助,但我不相信它是最好的解决方案。

谢谢佩特鲁斯

于 2009-09-03T08:35:54.570 回答
1

我不知道你是否仍然需要帮助,但我通过创建一个跟踪 selectedindex 的变量解决了这个问题,在我的例子中——当最初绑定时它总是 0,所以它对我来说更容易做,但是如果您通知视图模型适当的索引,我只是添加了一个

ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex
于 2012-02-24T00:23:13.680 回答
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 集合的类型是什么?

于 2009-09-03T14:20:20.443 回答
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 ....

}
于 2010-08-08T16:07:19.397 回答