none
Collectionクラスとのバインディング RRS feed

  • 質問

  • MVVMでアプリを開発しています。
    ComboBox に特定の色を列挙し、その色とTextBoxのForegroundをバインドさせるアプリを作っていますが、ComboboxにバインドしているViewModelのCollectionオブジェクトと、TextBoxをバインドさせる書式について教えてください。

    次のような手順で作成しています。

    ・ViewModelにObservableCollection<T>のプロパティを作成
    ・View の ComboBox と Collection をバインドして Collection内のオブジェクトの内容を表示 → OK!
    ・ComboBoxには、IsSynchronizedWithCurrentItem="True" を設定

    (参考)http://blogs.wankuma.com/kazuki/archive/2009/04/29/172276.aspx

    次に、View内の他のコントロールとComboBoxが選択しているオブジェクトとバインドさせます。

    以下のように View のコントロールの DataContext に ViewModel のコレクションを指定すれば、ComboBoxで選択したオブジェクトとバインドさせることができました。(ComboBoxと連動します)
    (参考)http://d.hatena.ne.jp/Yamaki/20080718

    例)
    【ViewModel】
     ObservableCollection<MyData> MyDataCollection
    【Viewのxaml】
      <TextBox Text="{Binding MyProperty}"  DataContext="{Binding MyDataCollection}" />


    しかしDataContextに特定のプロパティを指定してしまうと、ViewModelの他のプロパティが参照できなくなってしまうので、
    DataContextは、ViewModelのままにしておいて、

    【Viewのxaml】
       <TextBox  Text="{Binding MyDataCollection.(ComboBoxで選択されているもの).Name}" />

    みたいな主旨の記述したいのですが、どのように記述すればよいのでしょうか?

    <TextBox  Text="{Binding MyDataCollection.Name}" /> じゃだめでした。やっぱり。

    おわかりになりましたら、よろしくお願いします。

    2009年8月18日 5:42

回答

  • /はカレントのアイテムを指すので、以下でできるかもしれません。

    <TextBox  Text="{Binding MyDataCollection/Name}" />
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク NIM5 2009年8月19日 2:37
    2009年8月18日 8:21
    モデレータ

すべての返信

  • Resources に CollectionViewSource を用意して、コレクションを Source にする。
    で、各 Binding の Source はその CollectionViewSource を使用する。

    とすればいいんじゃないですかね?
    2009年8月18日 7:21
  • /はカレントのアイテムを指すので、以下でできるかもしれません。

    <TextBox  Text="{Binding MyDataCollection/Name}" />
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク NIM5 2009年8月19日 2:37
    2009年8月18日 8:21
    モデレータ
  • Hongliang さん。

    アドバイスありがとうございます。

    しっかりとCollectionViewSource がなんなのか理解してないのですが、下記のように記述してみましたが、バインドできませんでした。
    何か根本的に間違えているような気がするんですけど・・・

    あ~なんかすぐそこまで来ているような気がして1日ハマってしまいました(愚)


    その1
    --
    <UserControl.Resources>
            <CollectionViewSource x:Key="viewSource" Source="{Binding Source=MyCollection}" />
    </UserControl.Resources>

    <Grid>
        <TextBox Text="{Binding Path=MyProperty, Source={StaticResource viewSource} }"
    </Grid>


    その2
    --

    <UserControl.Resources>
            <CollectionViewSource x:Key="viewSource" Source="{Binding Source=MyCollection, Path=MyProperty }" />
    </UserControl.Resources>

    <Grid>
        <TextBox Text="{Binding Source={StaticResource viewSource} }"
    </Grid>
    2009年8月18日 14:07
  • trapemiyaさん

    > /はカレントのアイテムを指すので、以下でできるかもしれません。

    情報ありがとうございます。
    ひとまずやっては見ましたが、私のコードではバインドできませんでした。  (訂正→ 確認ミス バインドできました)

    が、こんな書式があるんですね。全く知りませんでした。
    今回の課題とは関係なく、大変興味がありますので引き続き調べてみます。

    / って検索するの難しいですね(^_^;

    • 編集済み NIM5 2009年8月19日 2:44
    2009年8月18日 14:09
  • >/ って検索するの難しいですね(^_^;
    この辺ですね。
    http://msdn.microsoft.com/ja-jp/library/ms742451.aspx
    http://msdn.microsoft.com/ja-jp/library/ms742531.aspx


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    2009年8月19日 2:27
  • すみません。

    <TextBox  Text="{Binding MyDataCollection/Name}" />

    こちらの表記でバッチリできました!コンボボックスとも連携しています。
    最初試したときは、どこか書き方を間違えていたようです。申し訳ございません。

    こんなに簡単できてしまっていいのかというくらい、びっくりしました。

    ありがとうございました。

    2009年8月19日 2:42
  • えムナウ さん、ありがとうございます。

    http://msdn.microsoft.com/ja-jp/library/ms742531.aspx

    そのものずばりですね。なるほど。
    MSDNの検索能力も上げないとだめですね・・・
    2009年8月19日 2:49
  • 検索してみました。英語ですけど以下が参考になると思います。

    Binding to the Current Item in WPF
    http://www.interact-sw.co.uk/iangblog/2007/09/03/bindtocurrent


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年8月19日 5:01
    モデレータ
  • trapemiya さん、情報ありがとうございます。

    英語ですが読みやすいですね。
    WPFの合同勉強会とかでは、データバインディングの説明として、スライダーで画像を回転させたりしてたんですけど、こっちの方が業務アプリエンジニアにはウケがよさそうですね。

    機会があったら、バインディングのサンプルはこっちにしてみようかなと思います。

    2009年8月20日 2:30
  • WPFの合同勉強会とかでは、データバインディングの説明として、スライダーで画像を回転させたりしてたんですけど、こっちの方が業務アプリエンジニアにはウケがよさそうですね。
    業務アプリの視点で解説しているページはあまり見かけませんので、私もいろんなところから情報を集めて四苦八苦しているのが本当のところです。
    NIM5さんはObservableCollection<T>を使われていますが、私も同じところに辿りついています。
    コントロール同士の連携ですが、私も最初に「/」で連携しませんでした。よく考えるとわかりましたが、ViewModelでObservableCollection<T>をシングルトンで公開しなきゃいけなかったのです。Viewのコントロール毎にObservableCollection<T>のインスタンスが作成されてbindしたら連携しないのは当たり前ですね。
    という私の失敗談を、今後このスレッドを読まれた方のために付け加えておきます。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年8月20日 3:01
    モデレータ