ブログ

割とコンピュータよりの情報をお届けします。

2018/07/1

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());
        }
    }

≫ Read More

2018/07/01 コンピュータ   TakeMe