WPF mvvm模式中数据源发送改变,往数组添加一个对象,前端不发生变化原因

前因:实现INotifyPropertyChanged接口:如果您的数据模型(Model)中的集合发生了变化(如添加了新的对象),该集合需要实现INotifyCollectionChanged接口,以便通知视图集合已经改变。对于集合中的单个元素,如果它们的属性发生变化也需要通知视图,那么这些元素应实现INotifyPropertyChanged接口。

1.数组使用的是list ,而不是ObservableCollection。ObservableCollection实现了INotifyCollectionChanged接口,可以自动通知视图集合中的更改。

 //之前:
  public List<KeyValuePair<long, string>> SoftwareTypes { get; set; } = new List<KeyValuePair<long, string>>(); 
 
 //修改:
 public ObservableCollection<KeyValuePair<long, string>> SoftwareTypes { get; set; } = new ObservableCollection<KeyValuePair<long, string>>(); 
 

2.线程问题:通过异步任务执行请求回调代码并不是在UI线程上运行,UI线程并没有被用来更新视图,这可能会导致更新问题。确保所有与UI相关的操作都在主UI线程上执行。可以使用Dispatcher.Invoke()或Dispatcher.BeginInvoke()来在UI线程上执行代码。

//之前 :
foreach (var item in data)
{
 	{
     	SoftwareTypes.Add(new KeyValuePair<long, string>(item.Id, item.TypeName));
 	}

 	if (Data.SoftwareTypeId > 0)
 	{
     	SelectSoftwareType = SoftwareTypes.FirstOrDefault(o => o.Key == 			Data.SoftwareTypeId);
 	}
 	else
 	{
     	SelectSoftwareType = SoftwareTypes.FirstOrDefault();
 	}
 }

//修改:
  App.Current.Dispatcher.Invoke(() =>
 {
     foreach (var item in data)
 {
     SoftwareTypes.Add(new KeyValuePair<long, string>(item.Id, item.TypeName));
 }

 if (Data.SoftwareTypeId > 0)
 {
     SelectSoftwareType = SoftwareTypes.FirstOrDefault(o => o.Key == Data.SoftwareTypeId);
 }
 else
 {
     SelectSoftwareType = SoftwareTypes.FirstOrDefault();
 }
 });

总结:MVVM模式中更新前端数据源要实现INotifyPropertyChanged接口,并且由主线程(ui线程)执行

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值