ABP框架下MVVM的Binding值不刷新问题

小海贼 2021-04-02 02:10:52



Model部分代码:


public class UcHDZCQViewModel : Screen
{
public string MacConnectedStatus
{
get
{

if (this.service != null && this.service.TranService != null && this.service.TranService.IsConnected)
return "已连接";
return "断开";
}
}

}
下面是界面绑定代码
<Label HorizontalAlignment="Center" FontSize="10pt">设备连接状态</Label>
<Label Margin="10,10,10,10" Height="40" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Content="{Binding MacConnectedStatus}" Foreground="White">
<Label.Resources>
<Style TargetType="Label">

<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Content}" Value="已连接">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Content}" Value="断开">
<Setter Property="Background" Value="Maroon"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Resources>
</Label>



问题说明:
this.service.TranService.IsConnected是一个窜口对象是否打开的标识,IsConnected 也是只读的属性,返回的是serialPort类的IsOpen属性。为什么窜口断开了Label不跟着更新??
...全文
384 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziqi0716 2021-05-24
引用 7 楼 小海贼 的回复:
[quote=引用 4 楼 ziqi0716 的回复:]MacConnectedStatus属性写的不合适。 如果是我,我会这么处理: public string MacConnectedStatus{get;private set;}//提供给View来绑定。 //当串口断开或连接时候,修改MacConnectedStatus的值 MacConnectedStatus=“已断开”;或者 MacConnectedStatus=“已连接”; 并加上这个: RaisePropertyChanged(nemeof(MacConnectedStatus));//触发属性更改事件,通知绑定这个属性的view更新。 代码段的写法也可以,这里就不啰嗦了。 总结: 就是说,你的vm中定义的属性应该简洁。至于这个属性值的修改,应该放在真正应该触发的地方,比如串口对象的事件处理函数中(串口连接,串口断开)。另外记得实现INotifyPropertyChanged接口,用于通知属性变更。
我引入了包PropertyChanged.Fody,添加了AddINotifyPropertyChangedInterface接口,不用再实现INotifyPropertyChanged 这个了。 其中的原因是窜口类未实现这个接口的原因,窜口类是微软封装的,我们也无法改变。所以这个就办法解决了。[/quote] 串口类你可以自己包装一下啊,搞个SerialPortViewModel类,将各个属性做个适配转换,实现INotifyPropertyChanged接口.变通一下!
  • 打赏
  • 举报
回复
小海贼 2021-05-23
引用 2 楼 以专业开发人员为伍 的回复:
Binding 只能识别几种指定的接口触发的事件 ,你的 MacConnectedStatus 到底触发了什么事件给 Binding 了?
我引入了包PropertyChanged.Fody,添加了AddINotifyPropertyChangedInterface接口,不用再实现INotifyPropertyChanged 这个了。 其中的原因是窜口类未实现这个接口的原因,窜口类是微软封装的,我们也无法改变。所以这个就办法解决了。
  • 打赏
  • 举报
回复
小海贼 2021-05-23
引用 4 楼 ziqi0716 的回复:
MacConnectedStatus属性写的不合适。 如果是我,我会这么处理: public string MacConnectedStatus{get;private set;}//提供给View来绑定。 //当串口断开或连接时候,修改MacConnectedStatus的值 MacConnectedStatus=“已断开”;或者 MacConnectedStatus=“已连接”; 并加上这个: RaisePropertyChanged(nemeof(MacConnectedStatus));//触发属性更改事件,通知绑定这个属性的view更新。 代码段的写法也可以,这里就不啰嗦了。 总结: 就是说,你的vm中定义的属性应该简洁。至于这个属性值的修改,应该放在真正应该触发的地方,比如串口对象的事件处理函数中(串口连接,串口断开)。另外记得实现INotifyPropertyChanged接口,用于通知属性变更。
我引入了包PropertyChanged.Fody,添加了AddINotifyPropertyChangedInterface接口,不用再实现INotifyPropertyChanged 这个了。 其中的原因是窜口类未实现这个接口的原因,窜口类是微软封装的,我们也无法改变。所以这个就办法解决了。
  • 打赏
  • 举报
回复
小海贼 2021-05-23
引用 5 楼 哎呀哇 的回复:
INotifyPropertyChanged 这个接口了解一下 普通属性变更是不触发通知的
我引入了包PropertyChanged.Fody,添加了AddINotifyPropertyChangedInterface接口,不用再实现INotifyPropertyChanged 这个了。 其中的原因是窜口类未实现这个接口的原因,窜口类是微软封装的,我们也无法改变。所以这个就办法解决了。
  • 打赏
  • 举报
回复
ziqi0716 2021-04-06
MacConnectedStatus属性写的不合适。 如果是我,我会这么处理: public string MacConnectedStatus{get;private set;}//提供给View来绑定。 //当串口断开或连接时候,修改MacConnectedStatus的值 MacConnectedStatus=“已断开”;或者 MacConnectedStatus=“已连接”; 并加上这个: RaisePropertyChanged(nemeof(MacConnectedStatus));//触发属性更改事件,通知绑定这个属性的view更新。 代码段的写法也可以,这里就不啰嗦了。 总结: 就是说,你的vm中定义的属性应该简洁。至于这个属性值的修改,应该放在真正应该触发的地方,比如串口对象的事件处理函数中(串口连接,串口断开)。另外记得实现INotifyPropertyChanged接口,用于通知属性变更。
  • 打赏
  • 举报
回复
哎呀哇 2021-04-06
INotifyPropertyChanged 这个接口了解一下 普通属性变更是不触发通知的
  • 打赏
  • 举报
回复
WPF 由于需要支持解释脚本式的程序,它大量地使用了“动态”特性,因此它在程序验证检查方面非常弱,它写出的程序不再是干净的、可在编译器就检查出大量bug的了。加上 WPF 引入了太多的动态类型,使得需要查资料、各种“想不到”的学习难度陡增,这就是 WPF 被诟病的主要原因。
  • 打赏
  • 举报
回复
Binding 只能识别几种指定的接口触发的事件 ,你的 MacConnectedStatus 到底触发了什么事件给 Binding 了?
  • 打赏
  • 举报
回复
小海贼 2021-04-02
难道没有人来回复一下?
  • 打赏
  • 举报
回复
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2021-04-02 02:10
社区公告

让您成为最强悍的C#开发者