Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ViewModel中的其他线程更新视图模型中的UI绑定集合时出错_C#_Wpf_Mvvm_Task Parallel Library_Mvvm Light - Fatal编程技术网

C# 从ViewModel中的其他线程更新视图模型中的UI绑定集合时出错

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;

我是WPF、MVVM、当然还有MVVMLight的不速之客,你能帮我做一些对我的项目非常关键的事情吗。我需要从从视图模型创建的不同线程更新视图中的集合。我的ViewModel完全不知道视图。我在视图模型中定义了一个可观察的集合:

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)
);