WinUI3桌面应用中能否用XAML绑定页面的两个DependencyProperty?
WinUI 3桌面应用:Page内部依赖属性绑定的XAML实现问题
目前WinUI 3桌面应用里,没法直接用XAML完成Page自身两个依赖属性(比如P1到P2)的绑定,以下是具体原因和可行的替代方案:
你试过的写法失效原因
ElementName/RelativeSource Self绑定:桌面应用的Page作为根页面时,XAML解析阶段自身还没完全初始化,绑定上下文没法正确指向自身的依赖属性,绑定自然失效。x:Bind:x:Bind是编译时绑定,Page实例在XAML初始化阶段还没构建完成,编译绑定解析不了自身属性路径。- Style Setter绑定:WinUI 3确实只允许VisualStateManager里的Setter用绑定,普通Style的Setter只能设静态值,不支持动态绑定。
- 嵌套
<views:HomePage/>:这种写法会无限递归创建HomePage实例,直接触发栈溢出,完全不可行。
靠谱的替代方案
既然XAML走不通,目前最稳妥的还是用代码实现:
方案1:代码创建绑定
在Page的构造函数(InitializeComponent()之后)或者Loaded事件里添加绑定逻辑:
public HomePage() { InitializeComponent(); Loaded += (_, __) => { var binding = new Binding { Source = this, Path = new PropertyPath(nameof(P1)), Mode = BindingMode.OneWay }; SetBinding(P2Property, binding); }; }
方案2:依赖属性回调同步
比绑定更轻量的方式是利用依赖属性的变更回调,当P1值变化时直接更新P2:
public static readonly DependencyProperty P1Property = DependencyProperty.Register(nameof(P1), typeof(YourType), typeof(HomePage), new PropertyMetadata(default, OnP1Changed)); public YourType P1 { get => (YourType)GetValue(P1Property); set => SetValue(P1Property, value); } public static readonly DependencyProperty P2Property = DependencyProperty.Register(nameof(P2), typeof(YourType), typeof(HomePage)); public YourType P2 { get => (YourType)GetValue(P2Property); set => SetValue(P2Property, value); } private static void OnP1Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is HomePage page) { page.P2 = (YourType)e.NewValue; } }
关于Setter绑定支持的问题
截至WinUI 3当前稳定版,官方还没开放常规Style Setter的动态绑定功能,也没有明确的上线时间表。短期内你还是得靠代码实现属性同步。
内容的提问来源于stack exchange,提问作者aturnbul
相关产品推荐
相关产品推荐

