绑定到父datacontext(out of itemssource)

时间:2014-04-22 19:26:59

标签: wpf windows-phone-8 mvvm binding caliburn.micro

在我的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属性绑定到视图模型,而不是列表项(在项目源中)。

1 个答案:

答案 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 ,但元素名称确实有效。所以,尝试使用第一种方法,它应该适合你。