在我的Windows Phone 8应用程序中,我有项目列表。我为列表项定义了ItemTemplate。
我希望在每个项目中显示视图模型中的一个值,而不是列表项本身。我应该如何设置从列表项到viewmodel的绑定。
我的数据模板是这样的:
<DataTemplate x:Key="template">
<StackPanel>
<TextBlock Text="{Binding Name}"/> <!-- From list item -->
<TextBlock Text="{Binding MyViewModel.Country ?? }"/> <!-- From view model -->
</StackPanel>
</DataTemplate>
那么如何将Country属性绑定到视图模型,而不是列表项(在项目源中)。
答案 0 :(得分:40)
由于您使用 WPF
标记了问题,我可以告诉您在WPF中执行此操作的方法,您可以验证是否可以在Windows Phone 8应用中重复使用。
首先,您可以将 x:Name
提供给ViewModel绑定到的根元素。说出它的窗口,在其上设置x:名称并使用 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>
第二次,您可以尝试使用 RelativeSource
来访问Visual树并获取根元素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从root元素继承DataContext(即你没有在ListBox上显式设置DataContext)。您也可以在ListBox上使用这两种方法代替Window。
注意 - 如上所述[{3}},未为Windows Phone 8定义 FindAncestor
,但元素名称确实有效。所以,尝试使用第一种方法,它应该适合你。