私のWindows Phone 8アプリには、アイテムのリストがあります。リストアイテムのItemTemplateを定義しました。
これらの各アイテムに、リストアイテム自体からではなく、ビューモデルからの1つの値を表示したいと思います。リストアイテムからビューモデルへのバインディングをどのように設定すればよいですか。
私のデータテンプレートは次のとおりです。
<DataTemplate x:Key="template">
<StackPanel>
<TextBlock Text="{Binding Name}"/> <!-- From list item -->
<TextBlock Text="{Binding MyViewModel.Country ?? }"/> <!-- From view model -->
</StackPanel>
</DataTemplate>
それでは、Countryプロパティをリストアイテムではなくビューモデルにバインドする方法(アイテムソース内)。
あなたの質問にWPF
のタグを付けたので、WPFでそれを行う方法を説明できます。 Windows Phone 8アプリで再利用。
最初に、x:Name
は、ViewModelがバインドされているルート要素に。それがウィンドウだとしたら、x:Nameを設定し、ElementName
を使用してバインドします。
<Window x:Name="myWindow">
...
<DataTemplate x:Key="template">
<StackPanel>
<TextBlock Text="{Binding Name}"/> <!-- From list item -->
<TextBlock Text="{Binding DataContext.MyViewModel.Country,
ElementName=myWindow }"/> <!-- From view model -->
</StackPanel>
</DataTemplate>
</Window>
2番目、RelativeSource
を使用して旅行を試すことができますビジュアルツリーとルート要素DataContextを取得します。
<DataTemplate x:Key="template">
<StackPanel>
<TextBlock Text="{Binding Name}"/> <!-- From list item -->
<TextBlock Text="{Binding DataContext.MyViewModel.Country,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=Window} }"/>
<!-- From view model -->
</StackPanel>
</DataTemplate>
さらに、ListBoxがルート要素からDataContextを継承している場合(つまり、ListBoxでDataContextを明示的に設定していない場合)。 ListBoxでもWindowの代わりに両方のアプローチを使用できます。
注-前述のように here 、FindAncestor
はWindows Phone 8では定義されていませんが、要素名は機能します。だから、最初のアプローチを試してみてください、それはあなたのために働くはずです。