WPF MVVM数据列表UI未刷新问题

1.VM后台数据列表:


        private ObservableCollection<TreeViewModel> _TreeFamilyData = new ObservableCollection<TreeViewModel>();
        /// <summary>
        /// 显示数据
        /// </summary>
        public ObservableCollection<TreeViewModel> TreeFamilyData
        {
            get { return _TreeFamilyData; }
            set { _TreeFamilyData = value; }
        }

2.数据源变化然后调用System.ComponentModel.ICollectionView集合刷新:


            System.ComponentModel.ICollectionView view = System.Windows.Data.CollectionViewSource.GetDefaultView(TreeFamilyData);
            view.Refresh();

WPF MVVM架构中,当需要在ViewModel后台线程更新视图的数据时,通常会采用以下几个步骤: 1. **使用命令(Command)**:ViewModel中创建一个`RelayCommand`或自定义的`ICommand`,这个命令通常会在后台线程执行。例如,你可以使用`Task.Run`、`Task.Factory.StartNew`或者`async`/`await`配合`Dispatcher.Invoke`或`ConfigureAwait(false)`来处理异步操作。 ```csharp public RelayCommand<Data> DataRefreshCommand => new RelayCommand<Data>(data => { Task.Run(() => { // 在这里执行耗时的操作 var result = PerformDataLoad(); // 使用 Dispatcher 将结果发送回UI线程 Application.Current.Dispatcher.Invoke(() => { ViewModelProperty = result; RaisePropertyChanged(nameof(ViewModelProperty)); }); }).ConfigureAwait(false); }); ``` 2. **观察者模式(Observables)**: 使用`INotifyPropertyChanged`接口或者NuGet包如`MVVM Light Toolkit`中的`ObservableCollection`来通知视图更新。当后台任务完成后,通过`RaisePropertyChanged`方法通知视图进行数据更新。 ```csharp private ObservableCollection<Data> viewModelProperty; public ObservableCollection<Data> ViewModelProperty { get { return viewModelProperty; } set { if (value == viewModelProperty) return; viewModelProperty = value; RaisePropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; ... protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } ``` 3. **避免直接更新UI**:始终在UI线程上更新视图,确保UI的响应性和线程安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值