web-dev-qa-db-ja.com

List <CustomObject>をWPF DataGridにバインドするにはどうすればよいですか?

私はWPFを初めて使用し、基本的なデータバインディングを行いたいと考えています。 CustomObjectのリストがあり、それをDataGridにバインドしたい。

MainWindow.xaml.cs

   using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                List<ArticleItem> list = new List<ArticleItem>() 
                {
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                };
            }
        }

        public class ArticleItem 
        {
            public int ID { get; set; }
            public int ViewCount { get; set; }
            public String Title { get; set; }
        }
    }

これは私のグリッドがどのように見えるかです:

<DataGrid Height="179" HorizontalAlignment="Left" Margin="54,65,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="382">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID"/>
            <DataGridTextColumn Header="ViewCount" />
        <DataGridTextColumn Header="Title" />
    </DataGrid.Columns>
</DataGrid>

私は簡単に言うことができるASP.Netからのデータバインディングに慣れています:

this.dataGrid1.DataSource = list;

WPFでどのように進める必要がありますか?

44
citronas

listが再作成されると思わない場合は、Asp.Netで使用したのと同じアプローチを使用できます(DataSourceの代わりに、WPFのこのプロパティは通常ItemsSource):

this.dataGrid1.ItemsSource = list;

ただし、listを新しいコレクションインスタンスに置き換える場合は、databindingの使用を検討する必要があります。

30
Snowbear

あなたはxamlコードでそれをする必要があります:

<DataGrid ItemsSource="{Binding list}" [...]>
  [...]
</DataGrid>

ObservableCollectionを実装するときに、変更をdatagridに伝播するため、INotifyCollectionChangedをバッキングコレクションとして使用することをお勧めします。

20
Femaref

実際、並べ替えやフィルタリングなどを適切にサポートするには、次のように、CollectionGridSourceをDataGridとリスト間のリンクとして使用する必要があります。

<Window.Resources>
  <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>   

DataGrid行は次のようになります。

<DataGrid
  DataContext="{StaticResource ItemCollectionViewSource}"
  ItemsSource="{Binding}"
  AutoGenerateColumns="False">  

コードビハインドでは、CollectionViewSourceをリンクにリンクします。

CollectionViewSource itemCollectionViewSource;
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource"));
itemCollectionViewSource.Source = itemList;

詳細な例については、CoedProjectに関する私の記事を参照してください。 http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings

12
Peter Huber

Xamlで列名を手動で指定する必要はありません。 AutoGenerateColumnsプロパティをtrueに設定するだけで、リストがDataGridに自動的にバインドされます。参照コード。 XAMLコード:

<Grid>
    <DataGrid x:Name="MyDatagrid" AutoGenerateColumns="True" Height="447" HorizontalAlignment="Left" Margin="20,85,0,0" VerticalAlignment="Top" Width="799"  ItemsSource="{Binding Path=ListTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  CanUserAddRows="False"> </Grid>

C#

Public Class Test 
{
    public string m_field1_Test{get;set;}
    public string m_field2_Test { get; set; }
    public Test()
    {
        m_field1_Test = "field1";
        m_field2_Test = "field2";
    }
    public MainWindow()
    {

        listTest = new List<Test>();

        for (int i = 0; i < 10; i++)
        {
            obj = new Test();
            listTest.Add(obj);

        }

        this.MyDatagrid.ItemsSource = ListTest;

        InitializeComponent();

    }
3
Neha