当存在欺骗时,ListBox选择器奇怪的行为

时间:2010-03-13 16:40:14

标签: c# wpf

我正在开发一个更大的项目atm,但我做了一个简单的例子来向你展示会发生什么......

using System.Collections.Generic;
using System.Windows;
namespace txt
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var obsLst = new List<Info> { new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" } };
            var temp = new List<Info>();
            for (var i = 1; i <= 3; i++)
            {
                temp.Add(obsLst[0]); //I add 3 of the same item from obsLst to temp
            }
            lst.DataContext = temp; //lst = ListBox
        }
    }
    public class Info
    {
        public string name { get; set; }
    }
}

ListBox ItemsSource设置为{Binding} ..

当我启动应用程序时,我会显示3个txt.Info对象,如果我点击它们中的任何一个,那么它们中的2个甚至全部都会被选中。根据我的理解,问题依赖于列表框选择器无法区分项目,因此不知道我选择了哪一个。

这是一张它看起来像什么的照片。 alt text

我只点击了第二个txt.Info项目。

我找到了一个解决方案,有人说我必须指定DisplayMemberPath,但我不能在另一个项目中真正做到这一点,因为我有一个对象的数据窗口。

关于如何解决这个问题的任何想法都会很棒..

提前谢谢。

编辑1: 这有效,但不是很好..

using System.Collections.Generic;
using System.Windows;

namespace txt
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var obsLst = new List<Info> { new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" } };
            var temp = new List<Container>();
            for (var i = 1; i <= 3; i++)
            {
                var t = new Container();
                t.obj = obsLst[0];
                temp.Add(t);
            }
            lst.DataContext = temp;
        }
    }
    public class Info
    {
        public string name { get; set; }
    }

    public class Container
    {
        public Info obj { get; set; }
    }
}

在这种情况下,您需要设置DisplayMemberPath =“obj”

为对象分配ID不起作用..

using System;
using System.Collections.Generic;
using System.Windows;

namespace txt
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var rand = new Random();
            var obsLst = new List<Info> { new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" }, new Info { name = "asd" } };
            var temp = new List<Info>();
            for (var i = 1; i <= 3; i++)
            {
                obsLst[0].id = rand.Next(10000);
                temp.Add(obsLst[0]);
            }
            lst.DataContext = temp;
        }
    }
    public class Info
    {
        public string name { get; set; }
        public int id { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

我之前有过这个问题,我通过在项目中添加id#来修复它,所以它们总是不同。