トップ回答者
Collectionクラスとのバインディング

質問
-
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}" /> じゃだめでした。やっぱり。
おわかりになりましたら、よろしくお願いします。
回答
すべての返信
-
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> -
>/ って検索するの難しいですね(^_^;
この辺ですね。
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 -
えムナウ さん、ありがとうございます。
> http://msdn.microsoft.com/ja-jp/library/ms742531.aspx
そのものずばりですね。なるほど。
MSDNの検索能力も上げないとだめですね・・・ -
検索してみました。英語ですけど以下が参考になると思います。
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/ -
WPFの合同勉強会とかでは、データバインディングの説明として、スライダーで画像を回転させたりしてたんですけど、こっちの方が業務アプリエンジニアにはウケがよさそうですね。
業務アプリの視点で解説しているページはあまり見かけませんので、私もいろんなところから情報を集めて四苦八苦しているのが本当のところです。
NIM5さんはObservableCollection<T>を使われていますが、私も同じところに辿りついています。
コントロール同士の連携ですが、私も最初に「/」で連携しませんでした。よく考えるとわかりましたが、ViewModelでObservableCollection<T>をシングルトンで公開しなきゃいけなかったのです。Viewのコントロール毎にObservableCollection<T>のインスタンスが作成されてbindしたら連携しないのは当たり前ですね。
という私の失敗談を、今後このスレッドを読まれた方のために付け加えておきます。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/