Symfoware

Symfowareについての考察blog

テキストエディタでWPF + XAML データバインド

テキストエディタ + csc.exeだけで、どこまでWPFなアプリケーションが
作成できるか挑戦中。

テキストエディタでWPF + XAML サブフォームの表示とパネルの入れ替え


今回は、データバインドについて調べてみます。



データバインド



C#のプログラムから、xamlの画面にお手軽にデータを設定する手法です。

こちらが非常に参考になります。
第5回 WPFの「データ・バインディング」を理解する


簡単なサンプルとして、こんな「win.xaml」を作成しました。


  1. <Window
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. Title="XamlReaderのテスト"
  4. Width="320"
  5. Height="240"
  6. FontSize="20"
  7. >
  8.     <StackPanel>
  9.         <TextBlock Text="{Binding X}" />
  10.         <TextBlock Text="{Binding Y}" />
  11.     </StackPanel>
  12. </Window>



TextBlockが2つ並んでいるだけです。

「{Binding X}」や「{Binding Y}」と記載することで、バインドできるようになる模様。


起動するためのプログラム「Sample.cs」はこんな感じ。


  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Markup;
  7. public class Sample {
  8.     [STAThread]
  9.     static void Main(string[] args) {
  10.     
  11.         Window win = new Window();
  12.     
  13.         // 作成したwin.xamlを読み込んで、Windowsオブジェクトを取得
  14.         using (FileStream infs = new FileStream("win.xaml", FileMode.Open)) {
  15.             XmlReader xmlReader = XmlReader.Create(infs);
  16.             win = (Window)XamlReader.Load(xmlReader);
  17.         }
  18.         
  19.         // データをバインド
  20.         win.DataContext = new { X = "データバインドで", Y = "データを追加"};
  21.     
  22.         // Window表示
  23.         var app = new Application();
  24.         app.Run(win);
  25.     }
  26. }




ビルドして実行してみると、そっけないですがプログラムから
画面上に値が反映できたことが確認できます。

179_01.png





コンボボックスの内容をデータバインド



コンボボックスの内容をバインドできるか試してみます。

win.xamlはこんな感じ。


  1. <Window
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. Title="テスト"
  4. Width="320"
  5. Height="240"
  6. FontSize="20"
  7. >
  8.     <StackPanel>
  9.         <ComboBox ItemsSource="{Binding X}" />
  10.     </StackPanel>
  11. </Window>




Sample.csはこんな感じ。


  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Xml;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Markup;
  8. public class Sample {
  9.     [STAThread]
  10.     static void Main(string[] args) {
  11.     
  12.         Window win = new Window();
  13.     
  14.         // 作成したwin.xamlを読み込んで、Windowsオブジェクトを取得
  15.         using (FileStream infs = new FileStream("win.xaml", FileMode.Open)) {
  16.             XmlReader xmlReader = XmlReader.Create(infs);
  17.             win = (Window)XamlReader.Load(xmlReader);
  18.         }
  19.         
  20.         // データをバインド
  21.         List<string> items = new List<string>();
  22.         items.Add("項目1");
  23.         items.Add("項目2");
  24.         items.Add("項目3");
  25.         
  26.         win.DataContext = new { X = items};
  27.     
  28.         // Window表示
  29.         var app = new Application();
  30.         app.Run(win);
  31.     }
  32. }




あっさりバインド出来ました。

179_02.png






コンボボックスの初期値指定



ふと、xamlで初期選択状態が指定できるんじゃないか?と思い、


  1. <Window
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. Title="テスト"
  4. Width="320"
  5. Height="240"
  6. FontSize="20"
  7. >
  8.     <StackPanel>
  9.         <ComboBox ItemsSource="{Binding X}" SelectedIndex="1" />
  10.     </StackPanel>
  11. </Window>



こんな感じで、SelectedIndexの指定を追加してみました。

179_03.png


プログラムの修正なしで、初期値指定の変更が行えました。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/01/19(土) 19:02:05|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# + WPF + XAML コマンドのバインドとメニューバー | ホーム | テキストエディタでWPF + XAML サブフォームの表示とパネルの入れ替え>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1089-0aab12f8
この記事にトラックバックする(FC2ブログユーザー)