在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是默认的?空值?我本以为后面的代码就是(就像同一个类一样).
就像在这个示例中我使用后面的代码来修改Label的内容,我可以直接使用:
someLabel.Content = "Counter " + counter++;
我希望作为背后的代码,如果DataContext在不同的类中,它不应该有你的UI更新问题.
解决方法
是的,DataContext的默认值为null,这是它在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采用默认值属性的第一个参数.
当它被所有子控件继承时,除非您指定窗口数据上下文,否则lable的DataContext将保持为null.
你可以使用someLabel.Content =“Counter”计数器;在codebehind中设置标签内容;因此,在后面的代码中访问您的控件是完全正常的.