35743


ご教授よろしくお願いします｡  
以下のコードのようにParentクラスのChildListプロパティにはChildクラスのインスタンス､さらにChildインスタンスはItemListというプロパティをもっており､さらにList構造になっています｡

[code]

    public class Parent
    {
      public List<Child> ChildList{get;set;}
    }
    
    public class Child
    {
      public List<string> ItemList{get;set;}
    }
    
    public class Item
    {
      public string ItemName {get;set;}
    }
[/code]

ここでxamlのGridViewに全てのItemを列挙したい場合のバインディング指定の方法がわかりません｡｡  
ご教授ください｡

[code]

     <DataGrid Name="testGrid" ItemsSource="{Binding ?}" AutoGenerateColumns="False" >
[/code]

  
今はコードビハインドでforeachを回しながら､ListにAddしていき､最後にGridViewのDataContextに突っ込んでいます｡｡｡


CC BY-SA 3.0
2017-06-20T01:39:52.463
35734
2017-06-21T01:59:32.380
12388
question
c# wpf xaml
WPF GridViewへのバインド対象がListの中のListの場合


Childクラスの`List<string> ItemList`は`List<Item>`の間違いでしょうか？  
入れ子状態のリストを1つのリストにまとめる場合はLinqの`SelectMany`が使えます。  
※入力内容を参照元のインスタンスに反映したいとのことだったので、DataGridTextColumnを追加してTwoWayバインディングにしました。

MainWindow.xaml

[code]

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <DataGrid Name="testGrid" AutoGenerateColumns="False" CanUserAddRows="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding ItemName, Mode=TwoWay}"/>
                </DataGrid.Columns>
            </DataGrid>
            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <Button Content="データ表示" Click="Button_Click"/>
            </StackPanel>
        </Grid>
    </Window>
    
[/code]

MainWindow.xaml.cs

[code]

    using System.Collections.Generic;
    using System.Linq;
    using System.Windows;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            private Parent Root;
            public MainWindow()
            {
                InitializeComponent();
                //適当にデータ生成
                Root = CreateData();
                //List<Item>をSelectManyしてItemsSourceに設定
                testGrid.ItemsSource = Root.ChildList.SelectMany(c => c.ItemList).ToList();
            }
    
            private Parent CreateData()
            {
                return new Parent
                {
                    ChildList = new List<Child>
                    {
                        new Child
                        {
                            ItemList = new List<Item>
                            {
                                new Item { ItemName = "値を変えて" },
                                new Item { ItemName = "ボタンを押せば" },
                            }
                        },
                        new Child
                        {
                            ItemList = new List<Item>
                            {
                                new Item { ItemName = "内容が" },
                                new Item { ItemName = "書き換わってる？" },
                            }
                        }
                    }
                };
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                //Childのインデックスと内容をすべて抽出
                var ss = Root.ChildList.SelectMany((c, i) => c.ItemList.Select(l => string.Format("Index {0}: {1}", i, l.ItemName)));
                MessageBox.Show(string.Join("\r\n", ss));
            }
        }
        public class Parent
        {
            public List<Child> ChildList { get; set; }
        }
        public class Child
        {
            public List<Item> ItemList { get; set; }
        }
        public class Item
        {
            public string ItemName { get; set; }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-20T06:54:22.893
35743
2017-06-21T01:59:32.380
2017-06-21T01:59:32.380
9820
9820
35734
answer