我正在浏览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/