【问题标题】:LINQ to Objects - binding to a ListViewLINQ to Objects - 绑定到 ListView
【发布时间】:2009-02-22 19:40:13
【问题描述】:

我在使用 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>

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

谢谢, 伊恩

【问题讨论】:

    标签: c# linq data-binding xaml


    【解决方案1】:

    更新

    关于 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();
    

    这是一个单独的列表,只是与原始列表有不同的项目。

    【讨论】:

    • 嗨 Marc 已经尝试过 - 遗憾的是它没有任何区别。此外,实际应用程序中的 LINQ 查询更为复杂,因此我有兴趣查看保留 LINQ 查询的解决方案。谢谢!
    • 谢谢马克。我已经修复了 XAML 错字,并使用 listView1.ItemsSource = mylist; 回到了简单的案例。但是列表视图项目仍然没有显示在表单上 - 但是两个空的列表视图行是可点击的。对象具有公共字段;类定义在上面 C# 的开头。
    • 查看更新;尝试使用属性(我发布了这样做的代码)
    • Marc - 它确实需要属性。这也适用于我的完整应用程序。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多