/ / Reference ViewModel's DataContext de dentro de um DataTemplate em um DataTemplate - silverlight, windows-phone-7, xaml, mvvm, windows-phone-8

Referência DataContext de ViewModel de dentro de um DataTemplate em um DataTemplate - silverlight, windows-telefone-7, xaml, mvvm, windows-phone-8

Eu me encontrei um pouco preso ... com amarras ... hehe ... (coxo)

Enfim ... Preciso me referir à propriedade principal do ViewModel, mas de dentro de um DataTemplate, que está dentro de outro DataTemplate... e parece que o único RelativeSource Os modos que o Silverlight permite são: Self e TemplatedParent. E o TemplatedParent não sobe o suficiente.

Existe algo que pode ser feito?

Algum código:

<phone:PanoramaItem>
<phone:LongListSelector Margin="0,-38,-22,2" ItemsSource="{Binding Items}">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<common:ItemContentTemplateSelector DataContext="{Binding}" Content="{Binding ItemContent}" HorizontalContentAlignment="Stretch" Margin="12,2,0,4">
<common:ItemContentTemplateSelector.DefaultTemplate>
<DataTemplate>
.....
</DataTemplate>
</common:ItemContentTemplateSelector.DefaultTemplate>
<common:ItemContentTemplateSelector.PhoneNumberTemplate>
<DataTemplate>
<Grid Background="White" Height="102">
<Border x:Name="border">
<TextBlock Text="Call"/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<!-- BINDING ERROR -->
<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=DataContext.PhoneCallCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
</Grid>
</DataTemplate>
</common:ItemContentTemplateSelector.PhoneNumberTemplate>
</common:ItemContentTemplateSelector>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
</phone:PanoramaItem>

Respostas:

3 para resposta № 1

Se você não quiser uma solução alternativa ou torná-la fácil, Há algo a fazer;

Usando StaticResource

Veja isso;

   MyViewModelClass ViewModel
{
get;set;
}

...ctor()
{
this.ViewModel=new MyViewModelClass();
this.DataContext=this.ViewModel; //We use same VM instance as DataContext as Resource
this.Resoureces.Add("MainVieModel",ViewModel);
InitializeComponents();//...Add resource before this line
}

Depois disso, você pode usar seu ViewModel ao mesmo tempo que um StaticResource em qualquer lugar que desejar;

{Binding Path=Items,Source={StaticResource ViewModel}}

Codifiquei no editor do stackoverflow. Pode haver alguns caracteres ausentes ...