C# 从ViewModel中的其他线程更新视图模型中的UI绑定集合时出错
我是WPF、MVVM、当然还有MVVMLight的不速之客,你能帮我做一些对我的项目非常关键的事情吗。我需要从从视图模型创建的不同线程更新视图中的集合。我的ViewModel完全不知道视图。我在视图模型中定义了一个可观察的集合:C# 从ViewModel中的其他线程更新视图模型中的UI绑定集合时出错,c#,wpf,mvvm,task-parallel-library,mvvm-light,C#,Wpf,Mvvm,Task Parallel Library,Mvvm Light,我是WPF、MVVM、当然还有MVVMLight的不速之客,你能帮我做一些对我的项目非常关键的事情吗。我需要从从视图模型创建的不同线程更新视图中的集合。我的ViewModel完全不知道视图。我在视图模型中定义了一个可观察的集合: public class LoginViewModel: ViewModelBase { public ObservableCollection<DatabaseConfiguration> DatabaseConfigurations{ get;
public class LoginViewModel: ViewModelBase
{
public ObservableCollection<DatabaseConfiguration> DatabaseConfigurations{ get; set; }
private DatabaseConfiguration _dbConfig;
public DatabaseConfiguration DbConfig
{
get{return _dbConfig;}
set
{
_dbConfig=value;
RaisePropertyChanged(()=>DbConfig);
}
}
public类LoginViewModel:ViewModelBase
{
公共ObservableCollection数据库配置{get;set;}
私有数据库配置_dbConfig;
公共数据库配置DbConfig
{
获取{return\u dbConfig;}
设置
{
_dbConfig=value;
RaisePropertyChanged(()=>DbConfig);
}
}
我使用System.threading.Task callback从viewmodel向集合添加项目:
void AddDBConfig(DatabaseConfiguration config)
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(
() =>
{
return DatabaseUtility.ValidateDatabaseConnectionConfiguration(config);
});
ExecuteAsync(asyncTask,
(IAsyncResult ar) =>
{
Task<bool> t1 = (Task<bool>)ar;
if (!t1.IsFaulted)
{
if (!(bool)result)
{
//problematic statement
DatabaseConfigurations.Add(config);
}
}
});
}
public void ExecuteAsync(Task<object> asyncTask, AsyncCallback callback)
{
asyncTask.ContinueWith(task => callback(asyncTask));
asyncTask.Start();
}
}
void AddDBConfig(数据库配置配置)
{
Task asyncTask=Task.Factory.StartNew(
() =>
{
返回DatabaseUtility.ValidateDatabaseConnectionConfiguration(配置);
});
ExecuteAsync(异步任务,
(IAsyncResult ar)=>
{
任务t1=(任务)ar;
如果(!t1.IsFaulted)
{
如果(!(bool)结果)
{
//有问题的陈述
DatabaseConfigurations.Add(config);
}
}
});
}
public void ExecuteAsync(任务异步任务,异步回调)
{
ContinueWith(task=>callback(asyncTask));
asyncTask.Start();
}
}
我在执行时遇到以下错误:
“此类型的CollectionView不支持从不同于Dispatcher线程的线程更改其SourceCollection”
MVVMLight toolkit中是否有任何变通方法或内置机制来从不同线程更新UI集合
你的帮助将是一个巨大的帮助!!!
谢谢!ContinueWith()
有一个重载接受任务调度程序。wpf和winforms有特殊的调度程序。您可以通过调用任务调度程序。FromCurrentSynchronizationContext()
请读
SalientBrain的答案也是正确的。Mvvm light有一个dispatcher助手类来处理这个问题。请参阅 首先,在viewmodel构造函数中初始化DispatcherHelper
DispatcherHelper.Initialize();
然后,使用CheckBeginInvokeOnUI从ui线程运行
DispatcherHelper.CheckBeginInvokeOnUI(
() => DatabaseConfigurations.Add(config)
);
请注意,使用mvvm light,属性更新会自动在ui线程上运行。只有集合需要dispatcher helper方法。感谢您的响应。请告诉我可以在哪个程序集/命名空间中找到部署。Current.dispatcher()?在System.Windows?或System.Deployment?中,后者没有定义“Current”属性,我想谢谢您的响应。请告诉我可以在哪个程序集/命名空间中找到Deployment.Current.Dispatcher()?在System.Windows?或System.Deployment?中,我想后者没有定义“Current”属性。我的是WPF MVVM应用程序、.net 4.5、MVVMLight Extras V 4。1@voroninp:谢谢。我在尝试调用Dispatcher.beginInvoke()时遇到编译器错误它说,非静态方法需要对象引用…要做什么…?!!@Ananth使用静态属性Dispatcher.current
DispatcherHelper.CheckBeginInvokeOnUI(
() => DatabaseConfigurations.Add(config)
);