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
相关产品推荐
相关产品推荐

