ListBox.SelectedIndex = -1未取消设置所选项目

时间:2013-03-07 16:52:57

标签: c# wpf listbox selecteditem

我在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>

在代码中,我按如下方式设置DataContext: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更改为新值时,即使模式为单一,它也将两个项目都设置为SelectedItems。有人可以解释出了什么问题吗?

非常感谢你的帮助。

修改

我已从XAML中删除了SelectedItem="{Binding SelectedObject, Mode=TwoWay}",并发现事情正常[大部分时间]正常工作。我正在更新ListBox的基础源,当更改影响==运算符评估的值与原始值不同时,我注意到SelectionChanged事件在RemovedItems中不包含任何内容。我将尝试制作对象的深层副本并更改深层副本,看看是否能解决我的问题。

最终更新

我制作了Leagues系列中FantasyLeague的深层副本。我有FantasyLeauge的成员绑定到可以更改的表单。当我对此进行深层复制时,表格的来源允许更改Leagues集合而不是原始集合,没有任何问题。我不确定为什么更改与==和.Equals评估相关联的值会导致此行为,而不仅仅是正确更新目标/源,但是,我已经解决了这个问题。如果有人对导致这种行为的原因有任何意见,我将不胜感激。感谢所有提出建议的人。

3 个答案:

答案 0 :(得分:1)

我意识到这已经过时了但是因为它在我的搜索中显示得很高,所以我想更新答案。我认为你应该使用.ClearSelected()方法,MSDN info。这应该清除列表框C#或VBA(.net)中的任何选择。

干杯,

答案 1 :(得分:0)

好的,首先,你应该使用ObservableCollection进行绑定。

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

尝试并可能发布其余代码。

答案 2 :(得分:0)

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

我希望这会有所帮助。