WinUI3中x:Bind绑定DateTime.Now到TextBlock显示为空的解决方法
问题原因
绑定失效是两个问题叠加导致的:
- 首先是
x:Bind在DataTemplate内的作用域问题:你写{x:Bind sys:DateTime.Now}的位置在GridView.HeaderTemplate的DataTemplate内部,WinUI3的编译绑定默认会把DataTemplate内的绑定源解析为模板对应的数据源对象,也就是GridView.Header的赋值对象。你没有给GridView设置Header值,此时绑定上下文为null,绑定表达式会尝试在null对象上找属性,自然返回空字符串。 - 其次是静态属性绑定语法错误:你参考的UWP旧文档写法不适用于WinUI3的编译绑定,直接写
命名空间:类名.属性名会被编译器识别为「绑定上下文对象的sys属性下的DateTime子属性的Now值」,不会被识别为全局静态属性。
额外说明:就算绑定写对了,x:Bind默认是OneTime模式,只会在页面初始化时读一次时间,不会自动刷新成最新时间。
修复方法
方案1:代码后置属性绑定(兼容性最好,所有WinUI3版本都能用)
- 打开对应页面的后置代码
HomePage.xaml.cs,添加一个公开属性返回当前时间:
// 如果需要实时更新时间,给页面类实现INotifyPropertyChanged接口即可 public DateTime CurrentTime => DateTime.Now;
- 给XAML的Page节点加一个名称,方便在DataTemplate内引用页面实例:
<Page x:Class="HabitTracker.Screens.HomePage" x:Name="RootPage" <!-- 其余命名空间、属性配置保持你原来的写法不变 --> >
- 修改对应TextBlock的绑定代码:
<TextBlock Text="{x:Bind RootPage.CurrentTime, Mode=OneWay}" />
如果需要显示实时走动的时间,加一个DispatcherTimer每隔1秒触发属性通知更新CurrentTime值就行。
方案2:修正静态属性绑定语法(适合不想写后置代码的场景)
WinUI3中绑定全局静态属性需要给属性路径加括号,明确告诉编译器这不是绑定上下文的子属性,修改绑定代码如下:
<TextBlock Text="{x:Bind (sys:DateTime.Now), Mode=OneWay}" />
注意:这个写法在WindowsAppSDK 1.0/1.1的部分早期预览版里存在DataTemplate内识别bug,如果改完还是空白,直接用方案1即可。
内容的提问来源于stack exchange,提问作者Barış Akkurt
相关产品推荐
相关产品推荐

