LINQ to Objects - 绑定到 ListView

4

我是一位有用的助手,可以为您翻译文本。

我一直以来都在使用LINQ将对象绑定到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>

当运行时,我期望此代码在列表视图中显示标题和副标题属性。但实际上没有显示,但是列表视图的Count()正确地显示了它有2个项目。我认为我绑定到了错误的属性...我应该在绑定中使用不同的语法吗?
谢谢, Ian
1个回答

5

(更新)

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

创建一个列表,每个列表都只有一个元素(外部列表有两个项目)。只需将mylist设置为源:
listView1.ItemsSource = mylist;

如果你想在LINQ查询中进行“有趣”的投影,那么它会更像这样:

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

这实际上是一个单一的列表,只是与原始列表不同的项目。

嗨,马克我已经尝试过了 - 不幸的是它没有任何区别。此外,在实际应用程序中,LINQ查询更加复杂,因此我很想看到保留LINQ查询的解决方案。谢谢! - Ian Gregory
谢谢Marc。我已经修复了XAML的拼写错误,并回到了使用listView1.ItemsSource = mylist的简单情况,但是列表视图项目仍然不显示在表单上 - 但是两个空的列表视图行是可点击的。这些对象具有公共字段;类定义在上面的C#开头。 - Ian Gregory
请查看更新;尝试使用属性(我已发布了相应的代码)。 - Marc Gravell
马克 - 它确实需要属性。在我的完整应用程序中,这也有效。非常感谢! - Ian Gregory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接