WPF ComboBox双向绑定异常:PLC端修改后控件未更新
解决WPF ComboBox与PLC变量绑定后PLC端修改未同步的问题
你遇到的核心问题很明确:当PLC端修改对应变量后,虽然TemperatureGS的值已经更新,但绑定的Temperature属性没有触发变更通知,导致ComboBox的SelectedItem没能同步刷新。
问题根源分析
你的Temperature属性是基于TemperatureGS计算生成的,但TemperatureGS的setter只通知了自身的属性变化,并没有通知依赖它的Temperature属性。而ComboBox绑定的是Temperature,所以UI完全不知道Temperature已经因为TemperatureGS的变化而改变了。
另外,你在OnNavigatedTo里调用OnPropertyChanged(Temperature)是个小错误——这个方法需要传入属性名称的字符串,而不是属性的实际值,这会导致初始化时的通知也无法正确触发。
具体解决方案
修改TemperatureGS的setter,当它的值发生变化时,额外触发Temperature属性的变更通知;同时修正OnNavigatedTo里的错误调用:
修改后的ViewModel关键代码
private short _temperature; public short TemperatureGS { get { return _temperature; } set { // 只有当值真的发生变化时,才触发Temperature的变更通知 if (SetProperty(ref _temperature, value)) { OnPropertyChanged(nameof(Temperature)); } } } public void OnNavigatedTo(NavigationContext navigationContext) { TemperatureGS = PLCread(0); // 修正为传入属性名称字符串,确保初始化时UI能正确获取值 OnPropertyChanged(nameof(Temperature)); }
另外,建议你在Temperature的setter里也明确指定属性名称,避免潜在的通知遗漏问题:
public string Temperature { get { return (TemperatureGS != 0) ? string.Format("{0} °C", TemperatureGS) : "80 °C"; } set { TemperatureGS = Convert.ToSByte(value.Replace(" °C", "")); // 明确指定属性名称,让UI精准感知变化 OnPropertyChanged(nameof(Temperature)); WriteTemperature(TemperatureGS); } }
为什么这样能解决问题?
- 当PLC端修改变量后,你通过
PLCread更新了TemperatureGS,此时TemperatureGS的setter会触发Temperature的PropertyChanged事件,UI就会重新读取Temperature的计算值,从而同步更新ComboBox的SelectedItem。 - 修正
OnNavigatedTo里的通知调用,确保页面初始化时UI就能正确获取到Temperature的初始值,避免初始状态异常。
内容的提问来源于stack exchange,提问作者Imad Boucetta
相关产品推荐
相关产品推荐

