WPF DataGridにバインドしてみた
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());
}
}
