XAML中Self方式绑定DataContext失效,代码后置中正常的问题咨询
为什么XAML中绑定Window的DataContext到自身不生效?
嘿,这个问题我见过好多次了——你完全没搞错这两种方式的核心目的,但执行时机的差异才是导致结果不同的关键!
先给你拆解一下:
- 当你在XAML里写
DataContext="{Binding RelativeSource={RelativeSource Self}}"时,这段绑定的解析发生在Window实例初始化的早期阶段。这时候窗口的对象还没完全构造完成,WPF的绑定系统还没法正确识别RelativeSource Self指向的当前窗口实例,自然就无法完成绑定。 - 而在代码后置的构造函数里写
this.DataContext=this时,窗口实例已经完全创建好了,所有依赖属性的初始化工作都已完成,这时候直接给DataContext赋值是实打实的属性设置,不存在绑定解析的时机问题,所以就能正常生效。
那怎么用纯XAML的方式解决这个问题呢?给你两个靠谱的方案:
方案1:用ElementName绑定
给Window设置一个x:Name,然后通过ElementName来绑定DataContext,这种方式的解析时机稍晚,能等到窗口实例命名完成后再处理绑定:
<Window x:Class="SampleDemoListBox.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="CurrentWindow" DataContext="{Binding ElementName=CurrentWindow}"> <!-- 你的窗口内容 --> </Window>
方案2:延迟绑定到Loaded事件
如果不想用ElementName,也可以把DataContext的设置放到Window的Loaded事件里,这时候窗口已经完全初始化完毕:
<Window x:Class="SampleDemoListBox.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="Window_Loaded"> <!-- 你的窗口内容 --> </Window>
然后在代码后置里添加Loaded事件处理:
private void Window_Loaded(object sender, RoutedEventArgs e) { DataContext = this; }
简单总结一下:你想把DataContext绑定到自身的思路完全没问题,只是XAML里的RelativeSource绑定时机太早,没赶上窗口实例的完全初始化。上面两种方案都能帮你在XAML场景下解决这个问题~
内容的提问来源于stack exchange,提问作者Shabana
相关产品推荐
相关产品推荐

