7

在 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是后面的代码。但我被迫指定DataContext. 哪个DataContext是默认值? Null? 我原以为后面的代码会是(因为是同一个类)。

在这个示例中,我使用后面的代码来修改标签的内容,我可以直接使用:

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

我希望作为背后的代码,如果DataContext它在不同的类中,它不应该有你遇到的 UI 更新问题。

4

2 回答 2

6

是的,默认值为,这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++;在代码隐藏中使用来设置标签内容;因此,在后面的代码中访问您的控件是非常好的。

于 2012-06-13T09:50:15.657 回答
3

由于您正在绑定 a 的属性Label,除非您以某种方式指定不同的绑定源,否则绑定引擎会假定这LabelText是该类的属性。它不能神奇地确定,因为绑定源Label的后代MainWindow应该是那个窗口,这就是为什么你需要显式声明它的原因。

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

于 2012-06-13T09:35:27.193 回答