我一直遇到使用LINQ将ListView绑定到Object的问题.最好用我创建的测试用例解释:
C#:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() { InitializeComponent(); } public class MySubClass { public string subtitle; } public class MyClass { public string title; public MySubClass subclass; } private void Window_Loaded(object sender, RoutedEventArgs e) { MySubClass sub = new MySubClass(); sub.subtitle = "This is the subtitle"; MyClass cls = new MyClass(); cls.title = "This is the title"; cls.subclass = sub; ObservableCollectionmylist = new ObservableCollection (); mylist.Add(cls); mylist.Add(cls); listView1.ItemsSource = (from c in mylist select new List {c}).ToList(); label1.Content = listView1.Items.Count.ToString(); } } }
XAML:
运行时,我希望此代码在listview中显示标题和副标题属性.它没有,但listview Count()正确显示它有2个项目.我想我绑定了错误的属性....我应该在绑定中使用不同的语法吗?
谢谢,伊恩
(更新)
重新xaml,看起来你错过了一行中的"Path =":
{Binding subclass.subtitle}
重新对象; 它可能需要属性; 尝试:
public class MySubClass { public string subtitle {get;set;} } public class MyClass { public string title {get;set;} public MySubClass subclass {get;set;} }
这条线:
(from c in mylist select new List{c}).ToList();
创建一个列表列表,每个列表都有一个元素(外部列表中有两个项目).只需设置mylist
为源:
listView1.ItemsSource = mylist;
如果你想在LINQ查询中做一个"有趣的"投影,那么它看起来更像是:
(from c in mylist select new { Foo = c.SomeProp, Bar = c.SomeOtherProp + 12 }).ToList();
这是一个单独的列表,只是与原始列表中的不同项目.