2013年01月29日

WPFサンプル:単一データ(単一オブジェクト)のバインディング(2)

   このエントリーをはてなブックマークに追加 Clip to Evernote
WPFサンプル:単一データのバインディング」で、単一オブジェクトをバインドする例を掲載しましたが、
もうひとつ例を載せます。
今回は、モデルとなるクラスにINotifyPropertyChangedインターフェースを実装し、
オブジェクトに体する変更がGUI側に反映されるようにしています。
INotifyPropertyChanged を実装する例は、こちらにも載せましたので重複している部分も
ありますが、ご容赦を。

以下のスクリーンショットに示すような簡単なプログラムを考えてみます。
ボタンを押すと、挨拶文が表示されるのですが、Friendryかどうかで、表示する挨拶文が変化します。

WPFObjectBinding1
WPFObjectBinding2

まずは、Greetingクラスです。前回示したINotifyPropertyChangedを実装しています。
Greetメソッドは、NotifyPropertyChanged で、Messageの変更を通知し、実際の挨拶文(Message)は、
Messageプロパティの getterで組み立てています。


では、XAMLを示します。


最後に、MainWindowクラスです。
ボタンクリックで、DataContextに設定されたGreetingオブジェクトのGreetメソッドを
呼び出しているだけです。
これにより、Messageの変更が通知され、Messageプロパティがバインドされている
TextBlockの表示が変更されます。


  

Posted by gushwell at 23:00Comments(0)TrackBack(0)

2013年01月27日

C#でパズルを解こう!

   このエントリーをはてなブックマークに追加 Clip to Evernote
これまで、もう一つのサイト「Gushwell's C# Programing Page」の「C#プログラム小品集」の中に、
パズル関連のプログラムを掲載していましたが、随分と数が増えてきたので、

C#でパズルを解こう!

というページとして独立させました。
パズルプログラミングに興味がある方は、是非ご覧になっていただけると嬉しいです。

  
Posted by gushwell at 18:21Comments(0)TrackBack(1)

2013年01月24日

WPFサンプル:INotifyPropertyChanged を実装し、オブジェクトの変更を反映させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
まずは、サンプルプログラムのスクリーンショットを載せます。

WPFINotifyPropertyChanged2

WPFINotifyPropertyChanged1

WPFINotifyPropertyChanged3

変更ボタンを押すと、2つのTextBoxの値(会社名とURL)が変わります。
その後確認ボタンを押すと変更後の会社名とURLがダイアログボックスの表示されます。

このC#プログラムのコードビハインドは以下の通りです。


buttonChange_Clickでは、GUIのコントロールにはアクセスしていません。
モデル側のCompanyオブジェクトの内容を変更すると、その変更がGUI側に
通知され、TextBoxの表示が変わります。

このシリーズ(WPFサンプル)でこれまで示したやり方では、バインディングモードをTowWayに
設定しても、バインディングソースのオブジェクト(Companyオブジェクト)が変更されても、
その内容がターゲット(TextBox)に反映されることはありませんでした。
これを反映させるには、ソースのクラスにINotifyPropertyChangedインターフェースを実装する必要があります。
ここでは、 NameとWebSiteの2つのプロパティを持ったCompanyクラスに、INotifyPropertyChangedを
実装しています。C#のコードを示します。


このCompanyクラスのオブジェクトをバインドするサンプルのXAMLを示します。



  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2013年01月22日

WPFサンプル:BindingクラスのModeプロパティでデータフローの方向を指定する

   このエントリーをはてなブックマークに追加 Clip to Evernote
Bindingクラスには、バインディングのデータフローの方向を設定するModeプロパティが存在します。
BindingMode値の動きを確認するサンプルプログラムを書いてみました。
左側のスライダーが、バインディングソース、右側のスライダーがバインディングターゲットです。

WPFBindingMode

Modeには、OneWay OneTime TwoWay OneWayToSource Default の5つが用意されています。

なお、規定値のDefaultは、それぞれのプロパティによって異なります。一般に、TextBoxやCheckBox
などのユーザーが編集できるコントロールプロパティは既定で双方向(TwoWay)のバインディングであり、
それ以外のほとんどのプロパティは既定で一方向(OneWay)のバインドになります。
この例では、ターゲットが、TextBoxのTextプロパティであるため、双方向バインディングとなります。


  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2013年01月21日

C#でビンパッキング問題を解く

   このエントリーをはてなブックマークに追加 Clip to Evernote
Webサイト「Gushwell's C# Programming Page」にビンパッキング問題を解くC#の
プログラムを掲載しました。

ビンパッキング問題は、重さの違う荷物が複数あり、それを箱に詰め込んでいくときに、どのように
詰めていけば、最少の箱で済むかを求める問題です。
Silverlightで書いていますので、実際に動かすことができます。興味のある方はどうぞご覧になって
ください。


この記事に対して、neuecc さんからフィードバックがありました。
Count() + First() を使うのは、2回走査が走るので、LINQ的にはよろしくないというものです。
確かにその通りですね。このコードだとどんな場合でも最後まで走査することになりますが,
FirstOrDefault ならば、最大で1つまでですからね。
そのうち直しておきます。

まあ、アルゴリズムの説明としては、Count() + First()のほうがわかりやすいことはわかりやすい
のですが...

ところで、「プログラム小品集」にプログラムを追加するのは、なんと5か月ぶりということで、
ずいぶん間が空いてしまいました。
ネタはあと6,7個考えているので、今後は月1回のペースで更新できればと思っています。

それと、「プログラム小品集」に掲載してているプログラム数ももずいぶんと増えたので、
いくつかに分割しようと考えています。
少なくとも、パズル関連は、
「C#でパズルを解こう」
として独立させようと考えています。

  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2013年01月20日

WPFサンプル:独自クラスをResourcesに指定し、StaticResourceで参照する

   このエントリーをはてなブックマークに追加 Clip to Evernote
独自のカスタムクラスをリソースに定義する例です。

サンプルでは、このPersonオブジェクトを、StaticResource マークアップ拡張を
使いTextBlockのTextプロパティにバインドしています。

WPFCustomClassResource

ここでは、C#側で定義したPersonクラスをWindows.Resourcesに追加し、インスタンスを生成しています。
XAMLに記述することで、インスタンスも生成されますので、C#側で Personクラスをnewする必要はありません。
この時、Name Ageの2つのプロパティに値を与えています。
このインスタンスが、MainWindowクラスのResourcesプロパティ(コレクションオブジェクト)に保持されるわけです。
xmlns属性で、Personクラスが定義してある名前空間を指定している点に注目してください。

ただ、本来は、固定的な値を扱いたいときに利用するものなので、Pseronクラスのような
オブジェクトをバインドするときには、StaticResourceを使って各プロパティをバインドする
のではなく、
WPFサンプル:単一データのバインディング の後半で示したように、DataContextを使うのが普通だと思います。




  
Posted by gushwell at 21:19Comments(0)TrackBack(0)

2013年01月17日

WPFサンプル:XAMLに定義したリソースにコードからアクセスする

   このエントリーをはてなブックマークに追加 Clip to Evernote
FindResourceメソッドを使うことで、XAMLに定義したリソースにアクセスできます。
ここでは、カスタムクラスPersonをXAMLで定義していますが、そのオブジェクトに
FindResouceメソッドおよびTryFindResourceメソッドでアクセスしています。

WPFFindResource

WPFFindResource2



  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2013年01月16日

WPFサンプル:別XAMLに定義したリソースをMergedDictionaries で読みこむ

   このエントリーをはてなブックマークに追加 Clip to Evernote
ResourceDictionaryのサンプルです。
この例では、ResourceDictionary.MergedDictionariesを使って、別のxamlファイルに定義した
リソース(ここではButtonとTextBoxのStyle)をApplication.Resourcesに読み込みマージしています。

ResouceDictionary1

ResouceDictionary2

■App.xaml

■SampleDictionary.xaml

■MainWindow.Xaml
  
Posted by gushwell at 22:30Comments(0)TrackBack(0)