wpf - 即使在 SelectionMode ="Single"中,ListBox 也会选择许多项目

标签 wpf .net-4.0 listbox binding

我遇到了一些很奇怪的,简单的 WPF 应用程序

<Window x:Class="ListBoxSelection.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox ItemsSource="{Binding Path=Strings}" SelectionMode="Single"/>
    </Grid>
</Window>

后面有代码
public class ViewModel
{
    public List<string> Strings { get; set; }

    public ViewModel ()
    {
        Strings = new List<string> ();
        Strings.Add ("A");
        // add many items ...
        Strings.Add ("A");
    }
}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow ()
    {
        InitializeComponent ();

        DataContext = new ViewModel ();
    }
}

当我点击一个项目时,

Why multiple values selected?

如果我继续单击项目,它们只会聚合。单击已选择的项目不会执行任何操作。挠头,我以前有到 ListBoxes 的数据绑定(bind)列表,以前从未见过。运行 Win7 (64)、VS2010,行为呈现 .Net 3.5、.Net 3.5 Client Profile、.Net 4 和 .Net 4 Client Profile。

Arg,我应该提到我期待正常的、默认的、单选行为。

最佳答案

丹·布莱恩特在他的评论中得到了大部分答案。

这里发生的是字符串实习。当您创建一堆具有相同值的字符串时,.Net 通过让对相同字符串值的所有引用实际上都引用相同的字符串对象来节省内存使用量。 (例如,参见 this 了解详情。)

我真的不知道为什么 ListBox 的行为方式与它完全一样,即当您第一次选择列表中的任何项目时,它会同时选择该项目和列表中的第一项。但是当您单击新项目时它不会取消选择,因为会检查 SelectedItem与您刚刚单击的项目不同,但事实并非如此。

通过将 ListBox 绑定(bind)到一组测试对象,我得到了完全相同的行为:

public class TestObject
{
    public override string ToString()
    {
        return GetHashCode().ToString();
    }
}

MainWindow.xaml :
<ListBox x:Name="MyListBox" ItemsSource={Binding}"/>

MainWindow.xaml.cs :
ObservableCollection<TestObject> test = new ObservableCollection<TestObject>();
TestObject t = new TestObject();
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
MyListBox.DataContext = test;

关于wpf - 即使在 SelectionMode ="Single"中,ListBox 也会选择许多项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843784/

相关文章:

c# - 检测 Microsoft.Office.Interop.Excel 可用性

当按下向右或向左箭头键时,C# 阻止列表框控件的默认操作

c# - 如何在悬停时更改列表框项目的背景颜色?

silverlight - 在列表框的末尾添加加载更多按钮而不会丢失虚拟化?

c# - 如何从 WPF 项目中运行控制台项目

c# - 将自定义对象数据显示到 ListBox WPF

wpf - 如何使用 WPF 实现无边框窗口?

wpf - XAML 中的幻灯片动画

c# - 在哪里可以找到 System.Runtime.Caching 以在 Windows 窗体应用程序中引用

vb.net - 在 Visual Studio 图形中标记轴