2010-03-13 52 views
2

我工作的一个更大的项目大气压,但我做了这个简单的例子告诉你什么是发生奇怪的行为..列表框选择时,有愚弄

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; } 
    } 
} 

列表框的ItemsSource设置为{}绑定..

当我启动应用程序时,我得到3个txt.Info对象显示,如果我点击其中任何一个,2或甚至所有的人都被选中。根据我的理解,问题依赖于列表框选择器无法区分这些项目,因此不知道我选择了哪一个。

这里是什么样子的照片.. alt text

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

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

上,我怎么能解决这个问题将是巨大的任何想法..

Thx提前。

编辑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 =“目标文件”

分配一个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

我前一阵子有这个问题,我通过将id#添加到项目中来解决它,所以它们总是不同。

+0

我已经有了一个Id,我还为每个对象创建了一个随机的int值,它们被添加到第二个列表中,但它仍然不起作用。 Atm我为Info对象创建了一些容器类(在这种情况下),所以我可以设置DisplayMemberPath。这并不好,所以我希望有更好的方法来解决这个问题。 – Bogdan 2010-03-13 16:45:21

+1

如果有,我从来没有找到它。我不是WPF列表框的大粉丝:( – Blindy 2010-03-13 16:56:34