我遇到了一些很奇怪的事情,简单的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 ();
}
}
当我点击单个项目时,
如果我继续单击项目,它们就会聚合。单击已选择的项目不会执行任何操作。挠头,我以前曾将数据绑定到列表框,但以前从未见过这种情况。运行 Win7 (64)、VS2010,行为会出现在 .Net 3.5、.Net 3.5 Client Profile、.Net 4 和 .Net 4 Client Profile 中。
Arg,我应该提到我期待正常的、默认的、单选的行为。
丹·布莱恩特在他的评论中得到了大部分答案。
这里发生的是字符串实习。当您创建一堆具有相同值的字符串时,.Net 通过使对同一字符串值的所有引用实际上引用同一字符串对象来节省内存使用量。 (看this,例如,了解详细信息。)
我真的不知道为什么 ListBox 的行为完全如此,即第一次选择列表中的任何项目时,它会同时选择该项目和列表中的第一个项目。但当您单击新项目时,它不会取消选择,因为会检查是否SelectedItem
与您刚刚单击的项目不同,但事实并非如此。
通过将 ListBox 绑定到测试对象集合,我得到了完全相同的行为:
public class TestObject
{
public override string ToString()
{
return GetHashCode().ToString();
}
}
In MainWindow.xaml
:
<ListBox x:Name="MyListBox" ItemsSource={Binding}"/>
In 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)