绑定到父datacontext(在itemsource之外)

dev*_*vha 17 wpf binding mvvm caliburn.micro windows-phone-8

在我的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>
Run Code Online (Sandbox Code Playgroud)

那么如何将Country属性绑定到视图模型,而不是列表项(在项目源中).

Roh*_*ats 41

由于您使用了标记问题WPF,我可以告诉您在WPF中执行此操作的方法,您可以验证是否可以在Windows Phone 8应用中重复使用.

首先,您可以为x:NameViewModel绑定到的根元素提供.说它的窗口,设置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>
Run Code Online (Sandbox Code Playgroud)

其次,您可以尝试使用RelativeSourceVisual tree并获取根元素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>
Run Code Online (Sandbox Code Playgroud)

更重要的是,如果ListBox从根元素继承DataContext(即您没有在ListBox上显式设置DataContext).您也可以在ListBox上使用这两种方法来代替Window.

注 -如前所述这里,FindAncestor是不是为Windows手机8定义,但元素的名称确实工作.所以,尝试使用第一种方法,它应该适合你.

  • ElementName使模板不可重用,WinRT/Windows应用商店应用中不存在FindAncestor.如何在Windows应用商店应用中绑定父上下文? (5认同)
  • 非常感谢Rohit!我使用caliburn micro,它看起来我使用指定视图模型进行绑定工作.所以这个适用于我{绑定DataContext.Country,ElementName = myWindow} (2认同)