【问题标题】:Binding Window's DataContext to the window itself in WPF在 WPF 中将窗口的 DataContext 绑定到窗口本身
【发布时间】:2015-03-09 12:18:48
【问题描述】:

我有一个从 Window 继承的简单对话框窗口,我在 XAML 中设置它的 DataContext,如下所示:

<Window x:Class="MyProject.MyDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        ...>
    <StackPanel>
        <TextBox Text="{Binding SomeText}"/>
        ...
    </StackPanel>
</Window>

这是我显示此对话框的方式:

var dialog = new MyWindow();
MyWindow.SomeText = "some text";

if (dialog.ShowDialog() == true)
    ...

由于某些原因,在创建窗口并且没有绑定错误时,不会将文本框的初始文本设置为“某些文本”。

但是,如果我为 StackPanel 而不是 Window 设置数据上下文:

<StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}">
    ...
</StackPanel>

一切都按预期进行。

这两者有什么区别?为什么第一种方法不起作用?

【问题讨论】:

  • 区别仅在于时间。虽然 RelativeSource Self 绑定在 Window 构造函数的执行期间被评估,但在设置 SomeText 属性时已经设置了 DataContext(因此您必须触发 PropertyChanged 事件)。 RelativeSource AncestorType=Window 绑定稍后评估,在 SomeText 已经设置之后,所以当 DataContext 被设置时,绑定源属性已经具有所需的值。

标签: wpf xaml


【解决方案1】:

您需要在您的窗口中实现 INotifyPropertyChanged 以使第一个案例工作。

窗口本身不会收到关于其属性(自身)被更改的通知,因此没有设置 dc。

【讨论】:

  • 谢谢,但这不是我要问的,请参阅我对@Theodosius 的回答的评论(反对票不是我的)。
  • 大声笑,我比他早 10 分钟发布了相同的答案,重复已经发布的答案有什么意义..@theodosious..
  • @szx,我可以解释其中的区别,但我猜这次 theo 会先言归正传..
  • 解释是---- ( 复制 ) .... XAML 实际上是在构造函数执行完成时解析的,因为 Dispatcher 等待用户代码(在 Window 的构造函数中)在执行其挂起的操作之前完成。这会导致这些不同时刻的实际属性值不同,并且由于没有 INotifyPropertyChanged,因此 WPF 无法更新 UI 以反映新值。
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2016-03-23
  • 2011-07-19
相关资源
最近更新 更多