2009-02-22 84 views
4

我一直在使用LINQ将ListView绑定到对象的问题。它是最好的我已经创建了一个测试用例解释说:LINQ to Objects - 绑定到ListView

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; 

      ObservableCollection<MyClass> mylist = new ObservableCollection<MyClass>(); 
      mylist.Add(cls); 
      mylist.Add(cls); 

      listView1.ItemsSource = (from c in mylist select new List<MyClass> {c}).ToList(); 

      label1.Content = listView1.Items.Count.ToString(); 
     } 
    } 
} 

XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <ListView ItemsSource="{Binding}" Name="listView1" Height="200" Grid.Row="0"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Title" Width="80" DisplayMemberBinding="{Binding Path=title}" /> 
        <GridViewColumn Header="Subtitle" Width="80" DisplayMemberBinding="{Binding subclass.subtitle}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <Label Name="label1" Grid.Row="1" ></Label> 
    </Grid> 
</Window> 

在运行的时候,我会想到这个代码显示在标题和副标题属性列表视图。它不,但listview Count()正确显示它有2个项目。我认为我绑定了错误的属性....我应该在绑定中使用不同的语法吗?

感谢, 伊恩

回答

5

更新

重新XAML中,它看起来就像你在该行缺少 “PATH =”:

{Binding subclass.subtitle} 

的Re对象;它可能需要属性;尝试:

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<MyClass> {c}).ToList(); 

创建列表的列表,每一个元素(并且在外列表中的两个项目)。只需设置mylist为源:

listView1.ItemsSource = mylist; 

如果你想要做的LINQ查询中添加一个“有趣”的投影,那么它看起来会更像是:

(from c in mylist select new { Foo = c.SomeProp, 
    Bar = c.SomeOtherProp + 12 }).ToList(); 

这是话单清单,只是将不同的项目放在原始列表中。

+0

嗨马克 已经企图 - 悲伤没有任何区别。另外,LINQ查询在真实应用程序中更加复杂,所以我有兴趣查看保留LINQ查询的解决方案。 谢谢! – 2009-02-22 19:51:33