C# 默认数据上下文
在MainWindow.xaml中具有以下xaml:C# 默认数据上下文,c#,.net,wpf,datacontext,C#,.net,Wpf,Datacontext,在MainWindow.xaml中具有以下xaml: 改变 以及MainWindow.xaml.cs中的以下代码: 公共静态只读DependencyProperty LabelTextProperty=DependencyProperty.Register(“LabelText”、typeof(String)、typeof(MainWindow)); 公共整数计数器=0; 公共字符串标签文本 { 得到 { 返回(字符串)GetValue(LabelTextProperty); } 设置 {
改变
以及MainWindow.xaml.cs中的以下代码:
公共静态只读DependencyProperty LabelTextProperty=DependencyProperty.Register(“LabelText”、typeof(String)、typeof(MainWindow));
公共整数计数器=0;
公共字符串标签文本
{
得到
{
返回(字符串)GetValue(LabelTextProperty);
}
设置
{
SetValue(LabelTextProperty,值);
}
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
LabelText=“计数器”+计数器++;
}
我本以为默认的DataContext
就是代码隐藏。但是我不得不指定DataContext
哪个DataContext
是默认值?Null
?我本以为后面的代码是(和同一个类一样)
在本示例中,我使用代码隐藏来修改标签的内容,我是否可以直接使用:
someLabel.Content=“Counter”+Counter++;
我认为,作为代码隐藏,如果
DataContext
在不同的类中,它不应该有UI更新问题。,因为您绑定的是标签的属性,除非以某种方式指定不同的绑定源,否则绑定引擎将假定LabelText
是该类的属性。它无法神奇地确定,因为标签
是主窗口
的后代,所以绑定源应该是该窗口,这就是为什么需要显式声明它
需要注意的是,“数据上下文”和“绑定源”的概念是不同的:这是指定绑定源的一种方法,但是。是的,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++设置标签内容;因此,在代码隐藏中访问控件是完全可以的。I但是,绑定/数据上下文在未指定时从父级继承。否则,在window类上设置datacontext仍然不会产生结果。@MiyamotoAkira:当然,它是继承的(关于datacontext
的文档也这么说)。但是为什么您希望您的main窗口在默认情况下成为任何内容的DataContext
?绑定引擎无法读懂您的心思。我想是因为我看到MainWindow
是该程序层次结构的顶层。但是,我不知道wpf在幕后做了什么(现在:-),而且可能还有其他事情在上面。Windows作为默认绑定上下文是有意义的,因为它确实隐藏了代码,事实上XAML中确实存在这样的实例。例如,在一个按钮元素上,“Click”属性可以简单地设置为字符串“btnOk_Click”,只要该函数存在于窗口的代码中,比如private void btnOk_Click(object sender,RoutedEventArgs e)
,它就会被调用。在这种情况下,窗口的默认数据上下文似乎就是它自己。不过,DataContext绝对必须是可空的,我认为空是最好的默认值。