我正在浏览Rachel撰写的优秀博客。这是link

她在“ View ”部分中提到“由于Button的DataContext是PageViewModel,因此她使用了RelativeSource绑定(bind)来查找ChangePageCommand”。
谁能解释一下,Button的DataContext是PageViewModel吗?

她写了另一个博客,解释了有关DataContext here的信息。从本文看来,Button的DataContext似乎是“ApplicationViewModel”,因为如果未指定元素的DataContext,它将继承其Parent的DataContext。而且,由于没有一个元素指定任何DataContext,因此Button的DataContext应该属于Window元素DataContext(在App.xaml.cs中定义为“ApplicationViewModel”)。

显然我在这里错了,但是我没有正确思考什么呢?

其他代码段可以在文章中找到,以下是XAML代码。

<Window x:Class="SimpleMVVMExample.ApplicationView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SimpleMVVMExample"
    Title="Simple MVVM Example" Height="350" Width="525">

<Window.Resources>
    <DataTemplate DataType="{x:Type local:HomeViewModel}">
        <local:HomeView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:ProductsViewModel}">
        <local:ProductsView />
    </DataTemplate>
</Window.Resources>

<DockPanel>
    <Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
        <ItemsControl ItemsSource="{Binding PageViewModels}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding Name}"
                            Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                            CommandParameter="{Binding }"
                            Margin="2,5"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Border>

    <ContentControl Content="{Binding CurrentPageViewModel}" />
</DockPanel>

最佳答案

因为您位于ItemsControl的ItemTemplate中。 DataContext被隐式定义为ItemsSource绑定(bind)集合提供的每个对象的绑定(bind)。

ItemsControl为ItemsSource集合中的每个项目创建一个ItemTemplate。每个ItemTemplate的DataContext将绑定(bind)到集合中正在迭代的单个对象。您可以阅读有关datatemplate行为here的更多信息。 (见备注)

因此,为了获得窗口的DataContext提供的ChangePageCommand,您必须提供相对的源查找。

关于wpf - 如何在此示例代码中找到Button的DataContext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26890435/

10-17 01:07