使用x:Bind绑定对象成员到TextBlock无UI显示的原因分析
问题原因与解决办法
这个问题属于x:Bind绑定里的典型场景,UI不更新的核心原因有两个,我给你拆解一下:
你的
Class1没有实现INotifyPropertyChanged接口
x:Bind(包括传统的Binding)要实现数据源到UI的实时更新,必须依赖属性变更通知机制。你当前的Class1里的name只是普通的自动属性,当你在按钮点击事件里修改它的值时,不会向UI发送任何“值已经变了”的通知,UI自然不会更新显示内容。x:Bind的Mode设置虽为TwoWay,但这不是核心问题
你设置了Mode=TwoWay,这个模式主要是用来实现UI输入向数据源同步值(比如TextBox输入同步到属性),但数据源向UI同步还是得靠变更通知。另外提一句,x:Bind默认的Mode是OneTime,你改成TwoWay是没问题的,但如果没有变更通知,哪怕Mode设对了也没用。
修改后的代码示例
首先修改Class1,让它实现INotifyPropertyChanged接口,添加属性变更通知:
using System.ComponentModel; using System.Runtime.CompilerServices; public class Class1 : INotifyPropertyChanged { private string _name; public string name { get => _name; set { if (_name != value) { _name = value; // 触发属性变更通知 OnPropertyChanged(); } } } // 实现INotifyPropertyChanged接口的事件 public event PropertyChangedEventHandler PropertyChanged; // 封装触发通知的方法,[CallerMemberName]可以自动获取属性名,不用手动写字符串 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
你的后台代码和XAML其实不需要额外修改(不过提一句:x:Bind默认绑定到页面实例,你设置DataContext = obl;其实是多余的,不过不影响功能)。
现在再点击按钮修改obl.name时,属性的setter会触发PropertyChanged事件,UI接收到通知后就会自动更新TextBlock的内容了。
内容的提问来源于stack exchange,提问作者Roshmi Benny
相关产品推荐
相关产品推荐

