gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:56:26 25 4
gpt4 key购买 nike

我遇到了一些很奇怪的,简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com