私は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でどのように進める必要がありますか?
list
が再作成されると思わない場合は、Asp.Netで使用したのと同じアプローチを使用できます(DataSource
の代わりに、WPFのこのプロパティは通常ItemsSource
):
this.dataGrid1.ItemsSource = list;
ただし、list
を新しいコレクションインスタンスに置き換える場合は、databinding
の使用を検討する必要があります。
あなたはxamlコードでそれをする必要があります:
<DataGrid ItemsSource="{Binding list}" [...]>
[...]
</DataGrid>
ObservableCollection
を実装するときに、変更をdatagridに伝播するため、INotifyCollectionChanged
をバッキングコレクションとして使用することをお勧めします。
実際、並べ替えやフィルタリングなどを適切にサポートするには、次のように、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
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();
}