web-dev-qa-db-ja.com

親のデータコンテキストにバインド(itemssourceの外)

私の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プロパティをリストアイテムではなくビューモデルにバインドする方法(アイテムソース内)。

17
devha

あなたの質問に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の代わりに両方のアプローチを使用できます。

-前述のように hereFindAncestorはWindows Phone 8では定義されていませんが、要素名は機能します。だから、最初のアプローチを試してみてください、それはあなたのために働くはずです。

41
Rohit Vats