You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3自定义控件嵌套数据绑定失效问题求助

问题分析与解决

问题根源

问题出在ControlB的构造函数中强制设置了DataContext为自身,破坏了WinUI中DataContext的继承机制:

  • ControlA的DataContext被设置为自身,内部元素默认继承该上下文,因此<TextBlock Text="{Binding Data.Item1}" />能正常找到ControlA的Data属性并显示内容。
  • 当在ControlA中给ControlB的Text属性绑定{Binding Data.Item2}时,该绑定原本应继承ControlA的DataContext(即ControlA实例),但ControlB构造函数中this.DataContext = this;的代码覆盖了继承的上下文,导致绑定会在ControlB实例中查找Data属性——而ControlB并未定义该属性,最终绑定失败,Text内容为空。

解决方案1:移除ControlB的DataContext手动设置,改用RelativeSource绑定内部元素

修改ControlB的构造函数,去掉DataContext的手动赋值,同时调整内部TextBlock的绑定逻辑,通过RelativeSource定位到ControlB的Text依赖属性:

ControlB的C#代码修改:

public ControlB()
{
    this.InitializeComponent();
    // 移除该行代码:this.DataContext = this;
}

ControlB的XAML代码修改:

<Grid>
    <TextBlock Text="{Binding Text, RelativeSource={RelativeSource AncestorType=local:ControlB}}" />
</Grid>

解决方案2:保留ControlB的DataContext设置,明确指定绑定源

如果需要保留ControlB的DataContext设置,可在ControlA的XAML中给ControlB的Text绑定明确指定源为ControlA实例:

ControlA的XAML修改:

<local:ControlB Text="{Binding Data.Item2, RelativeSource={RelativeSource AncestorType=local:ControlA}}" />

此方式会直接从ControlA实例中查找Data属性,不受ControlB自身DataContext的影响。

内容的提问来源于stack exchange,提问作者Clyde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:35:28