The DataContext
of the <ContentTemplate>
的特殊之处在于它被设置为Content
对象的属性<ContentTemplate>
正在被应用到。
在这种情况下,ContentTemplate
正在应用于一个Button
, 所以DataContext
在 - 的里面ContentTemplate
被设置为Content
那的财产Button
, and Button.Content
被设定为"0"
如果你应用这个ContentTemplate
到一个不同的Button
与不同的Content
财产,即Content
将使用属性来代替。
这是一个简单的例子,我希望能更好地演示这一点。
<Button x:Name="OuterButton" Click="Button_Click">
<!-- // Set DataContext to a string equal to "OuterButton.DataContext" -->
<Button.DataContext>
OuterButton.DataContext
</Button.DataContext>
<!-- // Set Content to a string equal to "OuterButton.DataContext" -->
<Button.Content>
OuterButton.Content
</Button.Content>
<Button.ContentTemplate>
<DataTemplate>
<StackPanel>
<Button x:Name="InnerButton" Content="InnerButton.Content" Click="Button_Click" />
<TextBlock FontWeight="Bold" Text="{Binding }"/>
</StackPanel>
</DataTemplate>
</Button.ContentTemplate>
</Button>
private void Button_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
Debug.WriteLine(string.Format("{0}.DataContext: {1}", btn.Name, btn.DataContext));
Debug.WriteLine(string.Format("{0}.Content: {1}", btn.Name, btn.Content));
}
我们这里有一个按钮。按钮的DataContext
and Content
属性设置为不同的值。该按钮还有一个ContentTemplate
定义,其中包含另一个Button
。这个按钮的Content
属性设置为不同的值。
单击任一按钮将输出Content
and DataContext
被单击的按钮的。请记住,内部按钮嵌套在 OuterButton 内部,因此当您单击它时,将为两个按钮处理 Click 方法。
点击内部按钮的最终结果:
InnerButton.DataContext: OuterButton.Content
InnerButton.Content: InnerButton.Content
OuterButton.DataContext: OuterButton.DataContext
OuterButton.Content: OuterButton.Content
如您所见,一个ContentTemplate
的特殊之处在于它设置了DataContext
to the Content
它所应用到的任何对象的属性。