亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

DataProviderですと。

毎日新しいクラスを発見している気がするよ。WPF

てなわけで、多言語対応の実装に時々見られるObjectDataProvider。
WPF Runtime Localization - CodeProject
これが多分シンプルさと実用性のバランスが一番いい方法だと思う。

んで、これのコード登場しているのがObjectDataProvider。

<ObjectDataProvider x:Key="Resources"
    ObjectType="{x:Type cultures:CultureResources}" MethodName="GetResourceInstance"/>
public Properties.Resources GetResourceInstance()
{
  return new Properties.Resources();
}

のワンセットで、リソースの実体を取得できる。(だからDataProviderなわけね)
んで、このオブジェクトをソースとしてバインディングできて・・・

<Label x:Name="labelCultureName"
    Content="{Binding Path=LabelCultureName, Source={StaticResource Resources}}"/>

リソース方式では難しかった{Binding 〜 }の構文がいとも簡単に書けると。

しかしクラスを指定しているだけなのにstaticじゃないオブジェクトが呼び出されているのが不思議。コードビハインドなら大丈夫ってことなのかなあ。[WPF][C#]ListBoxのデータをソートしたいとかを見ると、コードビハインド以外はstaticで宣言しているようにみえるけれど。

んで、詳しい情報をさぐって、例によってProWPFにお世話になります。

Pro Wpf in C# 2008: Windows Presentation Foundation With .net 3.5 (Books for Professionals by Professionals)

Pro Wpf in C# 2008: Windows Presentation Foundation With .net 3.5 (Books for Professionals by Professionals)


使用方法はだいたい、コードから読み取れる通り。

ただエラー処理機構が非常にまずいらしく、そこは注意しろと。
つまりメソッドで例外が出ると、コンストラクタに例外が飛んでくる。
んで、そこで例外をハンドルしても、アプリは落ちてしまうらしい(生成過程で失敗しているから納得)

それを防ぐためにIsAsynchronousというプロパティがあって、こいつを使うとオブジェクトの取得を
別スレッドで行うようになる。(なので例外が出ても何も起こらない)

まあ、リソース使ってる分にはきっと問題ないだろう.DBとかからデータを取ろうとしたときには注意が必要っぽいけど。