WPFでDataGridにデータをバインドしてみたが,多少はまったので記録
まずは,Viewの部分を確認。
<Window x:Class="WPFDataGrid.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:WPFDataGrid" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid x:Name="dataGrid" Margin="10,35,10,10" FontSize="30" AlternatingRowBackground="Azure" ColumnWidth="1*" HeadersVisibility="Column" AutoGenerateColumns="False"> <DataGrid.Columns > <DataGridTextColumn Header="Date Time" Binding="{Binding dateTime}"></DataGridTextColumn> <DataGridTextColumn Header="Tick" Binding="{Binding str}"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> <Button Content="確認用" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> </Grid> </Window>
次に乗せるデータを定義する。この例では,DataGridのコントロールからの変更ではなくタイマーで値を変更してプロパティ変更を通知してDataGridへ反映させることをシミュレートしてみた。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.ComponentModel; namespace WPFDataGrid { public class Datum : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string name) { if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(name)); } private Timer timer; public Datum() { dateTime = DateTime.Now; str = dateTime.Ticks.ToString(); timer = new Timer(); timer.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer); timer.Interval = 500; timer.Start(); } void OnElapsed_TimersTimer(object sender, ElapsedEventArgs e) { str = DateTime.Now.Ticks.ToString(); } public string _str = ""; public DateTime dateTime { set; get; } public String str { set { _str = value; OnPropertyChanged("str"); } get { return _str; } } } }
ObservableCollection
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.ObjectModel; namespace WPFDataGrid { public class NData : ObservableCollection<datum> { public NData() : base() { Add(new Datum()); Add(new Datum()); Add(new Datum()); } } }
最終的にItemsSourceへ入れてみた。
public partial class MainWindow : Window { private NData data = new NData(); public MainWindow() { InitializeComponent(); this.dataGrid.ItemsSource = data; } private void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show(data.ToString()); } }