我有一个ListView
绑定,ItemsSource
并且SelectionChanged
事件在加载/数据绑定事件上触发?我认为这是因为选择了“默认”项目,即索引 0。
我怎样才能禁用它?
我有一个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。
为了避免这种情况并仍然保留标记中的绑定,请在绑定之前将 dataContext 对象的 SelectedIndexValue 设置为 -1(在表单构造函数中调用 InitializeComponent() 之前)。
希望这可以帮助。
感谢您的回复。
当我在 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 事件中单击列表视图的指示器。这确实有帮助,但我不相信它是最好的解决方案。
谢谢佩特鲁斯
我不知道你是否仍然需要帮助,但我通过创建一个跟踪 selectedindex 的变量解决了这个问题,在我的例子中——当最初绑定时它总是 0,所以它对我来说更容易做,但是如果您通知视图模型适当的索引,我只是添加了一个
ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex
您可以尝试在绑定中将 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 ....
}