WPF ListView внутри ListView - PullRequest
4 голосов
/ 14 мая 2011

Я уверен, что мне не хватает чего-то простого / очевидного, но я не могу связать данные ListView в ListView

<Window x:Class="TestList.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate x:Key="InsideListTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="test" Width="50"></TextBlock>
            <TextBlock Text="{Binding OrderId}" Width="50"></TextBlock>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="OrdersTemplate">
        <ListView HorizontalAlignment="Stretch"
                  HorizontalContentAlignment="Stretch"
                  MinWidth="100"
                  MinHeight="25"
            ItemsSource="{Binding Orders}" 
            ItemTemplate="{StaticResource InsideListTemplate}" 
        >
        </ListView>
    </DataTemplate>
    <DataTemplate x:Key="CustomersTemplate">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
            <TextBlock Text="{Binding CustomerId}" Width="50" Foreground="Navy" VerticalAlignment="Center" />
            <ListBox ItemsSource="{Binding Orders}" ItemTemplate="{StaticResource OrdersTemplate}" HorizontalContentAlignment="Stretch"></ListBox>
        </StackPanel>
    </DataTemplate>

</Window.Resources>
<DockPanel LastChildFill="True">
    <ListView Name="listView" ItemTemplate="{StaticResource CustomersTemplate}" >
    </ListView>
</DockPanel>

using System.Collections.Generic;
namespace TestList
{
public partial class MainWindow
{
    public class Customer
    {
        public int CustomerId { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public int OrderId { get; set; }
    }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        var customers = new List<Customer>
                            {
                                new Customer
                                    {
                                        CustomerId = 1,
                                        Orders = new List<Order>
                                                     {
                                                         new Order {OrderId = 1},
                                                         new Order {OrderId = 2}
                                                     }
                                    },
                                new Customer
                                    {
                                        CustomerId = 2,
                                        Orders = new List<Order>
                                                     {
                                                         new Order {OrderId = 1},
                                                         new Order {OrderId = 2}
                                                     }
                                    }
                            };
        listView.ItemsSource = customers;
    }
  }
}

enter image description here

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Это объяснение ответа Хадис:

Вы связываете ListBox с коллекцией Orders в шаблоне клиента. А затем в шаблоне заказов вы снова определяете привязку ListView к заказам. Это означает, что связующим путем в этой точке является customer.orders.orders, который не существует.

Если вы просто удалите OrdersTemplate и поместите ListView там, где ListBox находится в шаблоне клиента, то это сработает.

2 голосов
/ 14 мая 2011

Как насчет изменения этого списка:

public partial class MainWindow : Window
{
    public class Customer
    {
        public int CustomerId { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public int OrderId { get; set; }
        public List<OrderItem> Items { get; set; }
    }

    public class OrderItem
    {
        public int No { get; set; }
        public string Name { get; set; }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        var customers = new List<Customer>
        {
            new Customer
            {
                CustomerId = 1,
                Orders = new List<Order>
                {
                    new Order {OrderId = 1, Items = new List<OrderItem>(new[] { new OrderItem { Name = "CD Player", No = 1}, new OrderItem { Name = "VCR Player", No = 2} })},
                    new Order {OrderId = 2, Items = new List<OrderItem>(new[] { new OrderItem { Name = "DVD Player", No = 1} })}
                }
            },
            new Customer
            {
                CustomerId = 2,
                Orders = new List<Order>
                {
                    new Order {OrderId = 1},
                    new Order {OrderId = 2}
                }
            }
        };
        listView.ItemsSource = customers;
    }
}

и на вашем Xaml измените его следующим образом:

<DataTemplate x:Key="InsideListTemplate">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding No}" Width="50"></TextBlock>
        <TextBlock Text="{Binding Name}" Width="50"></TextBlock>
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="OrdersTemplate">
    <StackPanel>
        <TextBlock Text="{Binding OrderId}" />
        <ListView HorizontalAlignment="Stretch"
              HorizontalContentAlignment="Stretch"
              MinWidth="100"
              MinHeight="25"
              ItemsSource="{Binding Items}" 
              ItemTemplate="{StaticResource InsideListTemplate}" />
    </StackPanel>
</DataTemplate>

И ваш вывод будет отображать детали Binding

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