【问题标题】:WPF ListView selection cannot be cleared on load?加载时无法清除 WPF ListView 选择?
【发布时间】:2011-04-27 20:50:28
【问题描述】:

我查看了几个相关的答案,并确定我可以通过设置 lstData.SelectedIndex = -1; 以编程方式清除选择。但是,当我在启动时设置数据上下文后立即执行此操作时,不知何故它永远不会起作用并被设置为选择列表中的第一个元素。

我还尝试将设置添加到 XAML,-1 实际上是 Visual Studio 的默认值,尽管它实际上不在 XAML 中,除非您设置它。即:

    <ListView Margin="6,6,6,203" 
        IsSynchronizedWithCurrentItem="True" 
        x:Name="lstData" 
        ItemsSource="{Binding}" 
        SelectionChanged="lstData_SelectionChanged" 
        HorizontalContentAlignment="Right"
        ItemContainerStyle="{StaticResource ItemContStyle}"  
        SelectedIndex="-1">

但这也没有效果。

另外,有趣的是,如果我输入 lstData.SelectedIndex = 3;在我的 LoadData 方法中,它将从选择的第三个成员开始设置。

这是我相关的窗口加载代码:

    public Window1()
    {
        InitializeComponent(); 

        // Set start and end dates to day after tomorrow, and 
        // the next day, by default:
        StartDate = DateTime.Now.AddDays(1);
        EndDate = StartDate.AddDays(2);
        txtStartDate.Text = StartDate.ToShortDateString();
        txtEndDate.Text = EndDate.ToShortDateString();
        LoadData();
    }

    public void LoadData()
    {
        App.RefreshMembers();

        App.CalculateNeededMeals(StartDate, EndDate);

        // Bind the ListBox to our ObserveableCollection
        LayoutRoot.DataContext = 
          App.db.PFW_Members.OrderBy("FullName",true).OrderBy("CancelDate",true);
        lstData.SelectedIndex = -1;
    }

并且在其他情况下会调用 LoadData(),在这种情况下,它会清除选择。只是不是第一次加载窗口。好像有一些初始化线程没有真正完成,如果在启动时选择为 -1,则将选择设置为 0。

哦,是的,我确实有一个选择更改处理程序,但它不会更改选择,即:

    private void lstData_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (lstData.SelectedItem == null)
        {
            btnReactivate.IsEnabled = false;
            btnDeactivate.IsEnabled = false;
        }
        else
        {
            if (((PFW_Member)lstData.SelectedItem).CancelDate == null)
            {
                btnReactivate.IsEnabled = false;
                btnDeactivate.IsEnabled = true;
            }
            else
            {
                btnReactivate.IsEnabled = true;
                btnDeactivate.IsEnabled = false;
            }
        }
    }

有没有办法让它真正等到加载,然后做一些事情,或者设置一个延迟事件或其他东西,或者有人对这里可能发生的事情有知识或理论吗?

感谢任何提示!

【问题讨论】:

  • 那你为什么不把它放在窗口加载事件中呢?
  • 因为我不知道是什么导致它无法工作,而且我还不熟悉 WPF 中的窗口加载事件(我现在要去看看)。您的建议也很好,因为它提供了一种方法来做想要的事情,并且如果我想要的话,IsSynchronizedWithCurrentItem 仍然是真实的。

标签: wpf listview selection selecteditem


【解决方案1】:

只需设置 IsSynchronizedWithCurrentItem="False"。这将是修复它的最简单方法。

这里发生的事情是这样的:在一切都被初始化之后(即在构造函数之后),绑定将启动。此时将设置 ListBox 的 ItemsSource。在这一步中,一些 ICollectionView 魔术在幕后发生。本质上,ListBox 将连接到源集合的默认 CollectionView,其 CurrentItem 属性始终默认为第一项。现在,如果 IsSynchronizedWithCurrentItem 为真,ListBox 将更新 SelectedItem 以等于 ICollectionView.CurrentItem。这就是导致您提到的问题的原因。

(注意:在所有这些发生之后,Loaded 事件将被触发。因此,dnr3 在 Loaded 事件中设置 SelectedIndex=-1 的注释也应该有效)。

希望这是有道理的。

【讨论】:

  • 啊哈!这样可行。非常感谢您的解决方案和解释! (我试图将此标记为有用,但我的声誉还不到 15 岁。)
  • 没问题。也许在将来的某个时候标记它。 (或不)。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多