ピースペース

SilverlightのComboBoxではまった

leave a comment »

久しぶりにまたSilverlightのコードを見ている。
旬じゃないルームに移動したことは間違いないが、それでもやっぱりレガシーなオラにはこのアーキが肌に合う。
効率よくコードを書けるというのは、たとえば社内で使うC/Sなシステムの入替には最適でなかろうか。どなんだろ??

ViewModelってのも最初意味がよくわからなかったけど、慣れてくるとだんだん納得できるようになってくる。
あと2、3個くらいプロジェクトをやるともう少し上手に使えるようになる気がする。
なので、なんとかもう少し頑張ってほしい→Silverlight
というか、JavaScriptな世界でも普通になるんだろうか??→ViewModel

今回はComboBoxに1週間ずっぽりはまってしまった。
Webを調べると、ComboBoxのBindingにはみんな苦労している様子がうかがえる。
不具合として報告されている件もいくつかあるが、
今回のオラの問題がその不具合に起因するのか、それとも単に使い方を(わかってなくて)間違っているのか?
それはまだはっきりしていない。でも、なんとなく解決できたようなのでメモを残す。

問題が発生したパターン
あるデータ入力のフォームがあって、そのある属性をComboBoxで入力する。
XAML上ではComboBoxはDataFormのEditTemplate内に配置している。
ComboBoxはA,B2つあって、cboxAのリストはどのデータでも同じ、
cboxBの選択リストはcboxAの選択に依存する。という、あまりやりたくはないが、よくある要件;;
この入力フォームもなんとかできて当初うまく動作していたが
前後レコードへのナビゲーションボタンの配置要求が追加になって問題が露見した。

ComboBoxのXAMLはこんな感じ

<toolkit:DataField Label="種別B:">
    <ComboBox 
          ItemsSource="{Binding Source={StaticResource root}, Path=DataContext.ComboLIstB}"
          DisplayMemberPath="B_NAME"
          SelectedValuePath="B_ID"
          SelectedValue="{Binding B_ID, Mode=TwoWay}"
          />
</toolkit:DataField>

レコードナビゲーションボタンのクリックで
DataFormのCurrentItemを入れ替える。と同時に、ViewModelのComboLIstBもセットしなおす。
ComboBoxの選択リスト自体は問題なく切り替わってくれる。
が、なぜかひとつ前に表示していたデータのB_IDがNullリセットされたり
移動したデータのSelectedがうまくSelectedされなかったりする。

最初はなにがなんだかわからずトホーにくれる。
いろいろ試しているうちに、ComboBoxがデータにつながっている状態でItemsSourceを入れ替えると
その瞬間にUnselectedにリセットされる。のが原因だと見えてくる。
ComboBoxのUnloaded、Loadedでデータとのつながりを切ったり、接続しなおしたりする。という作戦。
とりあえず、オラの場合はこれでうまく動いているよーだが…

private void cboxB_Unloaded(object sender, RoutedEventArgs e)
{
    ComboBox cbox = (ComboBox)sender;
    if (cbox == null) return;

    cbox.DataContext = null;
}

private void cboxB_Loaded(object sender, RoutedEventArgs e)
{
    ComboBox cbox = (ComboBox)sender;
    if (cbox == null) return;

    if (cbox.DataContext == null)
    {
        cbox.ItemsSource = dm.ComboLIstB;
        cbox.DataContext = DetailForm.CurrentItem;
    }
}

ここにたどり着くまでにまるまる1週間(T.T)
ちなみに、Silverlight5でも試したけど同じ現象なので、 これは、多分、仕様なのだろう…
としても、↑なコードが必要になるのはダメすぎるので
きっともっと良い手順があるに違いない。
が、その説明もないのでなかなかやっかいだ→ComboBox

Written by nasu38yen

2012年2月29日 @ 9:22 AM

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。