在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
?我本以为后面的代码就是(就像同一个类一样)。
正如在这个示例中我使用后面的代码来修改Label的内容,我可以直接使用:
someLabel.Content = "Counter " + counter++;
我希望作为背后的代码,如果DataContext
在不同的类中,它不应该有你的UI更新问题。
答案 0 :(得分:5)
是的,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
获取默认值属性的第一个参数。
除非您指定窗口数据上下文,否则所有子控件都会继承您的标签DataContext
null
。
您可以在代码隐藏中使用someLabel.Content = "Counter " + counter++;
来设置标签内容;因此,在后面的代码中访问你的控件是完全正确的。
答案 1 :(得分:3)
由于您绑定了Label
的属性,除非您以某种方式指定不同的绑定源,否则绑定引擎会假定LabelText
是该类的属性。它不能神奇地确定,因为Label
是MainWindow
的后代,绑定源应该是该窗口,这就是你需要明确声明它的原因。
重要的是要注意&#34;数据上下文&#34;的概念。和#34;绑定源&#34;是截然不同的:DataContext
是单向来指定绑定源,但是there are also others。