默认的DataContext(Default datacontext)

2019-09-18 01:26发布

具有低于在MainWindow.xaml的XAML:

<Window x:Class="TestDependency.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
    <Grid.RowDefinitions>
      <RowDefinition></RowDefinition>
      <RowDefinition></RowDefinition>
      <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Label Name="someLabel" Grid.Row="0"  Content="{Binding Path=LabelText}"></Label>
    <Button Grid.Row="2"  Click="Button_Click">Change</Button>
  </Grid>
</Window>

而在后面的MainWindow.xaml.cs下面的代码:

public static readonly DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText", typeof(String), typeof(MainWindow));

public int counter = 0;

public String LabelText
{
  get
  {
    return (String)GetValue(LabelTextProperty);
  }

  set
  {
    SetValue(LabelTextProperty, value);
  }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
  LabelText = "Counter " + counter++;
}

我本来以为默认DataContext是后面的代码。 但我不得不指定DataContextDataContext是默认? Null ? 我本来以为后面的代码将是(因为是同一个类)。

而作为此示例中,我使用后面的代码修改标签的内容,我可以直接使用:

someLabel.Content = "Counter " + counter++;

我会想到的是被后面的代码,它不应该有,你有,如果在UI更新问题DataContext是在不同的类。

Answer 1:

是的,默认值DataContextnull ,这里是它是如何在声明FrameworkElement类-

public static readonly DependencyProperty DataContextProperty = 
    DependencyProperty.Register("DataContext", typeof(object),
    FrameworkElement._typeofThis,
    (PropertyMetadata) new FrameworkPropertyMetadata((object)null,
        FrameworkPropertyMetadataOptions.Inherits,
        new PropertyChangedCallback(FrameworkElement.OnDataContextChanged)));

FrameworkPropertyMetadata花费的属性缺省值第一个参数。

因为它得到所有的孩子继承控制您拉布勒的DataContext仍然是null ,除非你指定窗口数据上下文。

您可以使用someLabel.Content = "Counter " + counter++; 在代码隐藏设置标签内容; 因此它是完全正常访问您的控件的代码后面。



Answer 2:

既然你绑定的属性Label ,除非您指定一个不同的结合源莫名其妙绑定引擎假定LabelText是这个类的一个属性。 它不能神奇地确定,因为Label是一种的后代MainWindow绑定源应该是窗口,这就是为什么你需要明确申报。

需要注意的是“数据上下文”和“绑定源”的概念是不同的这一点很重要: DataContext是指定绑定源的一种方式 ,但有 也 人 。



文章来源: Default datacontext