Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 默认数据上下文_C#_.net_Wpf_Datacontext - Fatal编程技术网

C# 默认数据上下文

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中具有以下xaml:


改变
以及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绝对必须是可空的,我认为空是最好的默认值。