ListBox.SelectedIndex = -1不能取消所选项目

3

我有一个在XAML中定义的列表框,如下所示:

<ListBox x:Name="listLeagues" DisplayMemberPath="LeagueName" 
         SelectionChanged="listLeagues_SelectionChanged"
         SelectedItem="{Binding SelectedObject, Mode=TwoWay}"
         SelectionMode="Single"    
         BorderBrush="{StaticResource noBrush}" Background="{StaticResource noBrush}"
         ScrollViewer.HorizontalScrollBarVisibility="Disabled">
</ListBox>

在代码中,我设置数据上下文如下:listLeagues.ItemsSource = Leagues;其中'Leagues'是一个自定义集合。我正在尝试使用以下代码在代码中更改选定的项目:
    private void addButton_Click(object sender, MouseButtonEventArgs e)
    {
        FantasyLeague addedLeague = new FantasyLeague();
        Random rnd = new Random();
        addedLeague.LeagueName = "New Leauge " + rnd.Next(100).ToString();

        Leagues.Add(addedLeague);

        listLeagues.SelectedIndex = -1;
        listLeagues.SelectedItem = addedLeague;
        LeagueDetailsClickHelper();
    }

我的列表框SelectionMode = Single。代码行listLeagues.SelectedIndex = -1;没有影响,当将SelectedItem更改为新值时,即使模式为Single,它也具有两个项目作为SelectedItems。有人能解释一下出了什么问题吗?
非常感谢您的帮助。
编辑
我已经从XAML中删除了SelectedItem="{Binding SelectedObject, Mode=TwoWay}",并发现事情正在正常进行[大部分时间]。我正在更新ListBox的基础源,并且当更改影响==运算符评估与原始值不同的值时,我注意到SelectionChanged事件不包括RemovedItems中的任何内容。我将尝试制作对象的深层副本并更改该深层副本,看看是否解决了我的问题。
最终更新
我制作了一个FantasyLeague的深层副本,该副本位于Leagues集合中。我将FantasyLeauge的成员绑定到可以更改的表单上。当我制作此的深度副本时,允许更改Leagues集合的表单的源而不是原始源时,就没有问题了。我不确定为什么更改与==和.Equals相关的值会导致这种行为,而不仅仅是正确地更新目标/源,但是我已经解决了这个问题。如果有人对导致这种行为的原因有输入,我将不胜感激。感谢所有提出建议的人。

尝试首先将 SelectedItem 属性设置为 null,然后再将新添加的项指定为选定项。 - Abbas
我添加了这行代码 listLeagues.SelectedItem = null; 但它似乎没有任何作用。 - Harrison
1
你尝试将XAML更改为SelectedItem =“{Binding SelectedObject,Mode = OneWay}”了吗? - yaens
我尝试了双向绑定、单向绑定和默认绑定,但都没有成功。感谢您的建议。 - Harrison
3个回答

0

我知道这篇文章有点老了,但由于它在我的搜索结果中排名很高,所以我想更新一下答案。我认为你应该使用 .ClearSelected() 方法,MSDN info。这将清除 C# 或 VBA (.net) 中列表框中的任何选择。

祝好!


0

好的,首先您应该使用一个ObservableCollection进行绑定。

其次,您正在将实际的UI SelectedIndex设置为-1(这完全违背了绑定的目的)。您需要设置DataSource的索引。

尝试这样做,可能需要发布您代码的其余部分。


你能解释一下“设置数据源的索引”是什么意思吗?由于数据源是Leagues集合,我不明白你在建议什么。Leagues自定义集合不是Observable集合。我正在自学编程,并选择了这个来尝试实现INotifyCollectionChanged接口。我不确定Observable集合如何相关,因为我没有问题通过底层集合更新ListBox,但是在SelectedItem属性方面遇到了问题。我不确定其他代码是否相关。 - Harrison

0
listLeagues.SelectedIndex = -1;
    listLeagues.SelectedItem = addedLeague;
**listLeagues.UpdateLayOut();**

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接