LINQ to Objects - привязка к ListView - PullRequest
4 голосов
/ 22 февраля 2009

У меня возникла проблема с привязкой ListView к объекту с помощью LINQ. Лучше всего это объяснить с помощью созданного мной теста:

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 голосов
/ 22 февраля 2009

( обновлен )

Re 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();

В таком случае это один список, просто с разными элементами по сравнению с исходным списком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...