UserControlsを、この例ではListBox内のDataTemplatesとしてページやウィンドウなどの他のUserControlsで再利用したいとします。すべてがMVVMです。ListBox内のDataTemplateとしてUserControl
私は単純なオブジェクト "カード"を表示するために "CardControl"と呼ばれるUserControlを持っています。カードには「ID」と「CardImage」の2つのプロパティがあります。コントロールDataContextは、XAMLを介して設定されます。このUserControlをVSまたはBlendで開くと、対応するViewModelで定義したダミーのカードが表示されます。
私はカードのコレクションを表示する必要があります "CardSetControl"と呼ばれる別のUserControlがあります。したがって、ViewModelにはObservableCollectionタイプの1つのプロパティー「<カード>」が「カード」と呼ばれています。ここで
はコードです:
<ListBox x:Name="MyList" ItemsSource="{Binding CardSet.Cards}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- WORKING, but not what i want -->
<TextBlock Text="{Binding ID}" /> // would display ID of Card
<Image Source="{Binding Image}" /> // would display Image of Card
<!-- NOT WORKING, but this is how i want it to work -->
<UserControls:CardControl DataContext="{Binding "Current listbox item as DataContext of CardControl???"}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
、私はまだそれが動作するように取得していないバインディングMVVMとのDataContext /記事のトンを読んだ後。この階層的なUSerControls/DataContextsの全体の仕組みは、どのように最善の方法で行われますか?
ウィル、私は基本的にあなたとまったく同じ答えを与えた私の謝罪。私は次回に答える前にページを更新する必要があります;) –
このようにして、モデル(カード)はDataContextとしてユーザーコントロールに渡されます。ビューモデルを使用するためにそのユーザーコントロールを使用したい場合はどうすればよいですか?このモデルをビューモデルに渡してビューモデルをコントロールのビューにバインドするにはどうすればよいですか? –
@OndrejJanacek:UserControlsは、独自のビューモデルを持つように設計するべきではありません。彼らは、ユーザーが自分のビューモデルにバインドする公開可能なバインディング可能なプロパティをそのサーフェスに配置する必要があります。この回答は、ベストプラクティスよりもOPの方がよりよく形成されています。/ – Will