2

私は WPF、MVVM、そしてもちろん MVVMLight の初心者です。私のプロジェクトにとって非常に重要なことを教えてください。ビュー モデルから作成された別のスレッドからビュー内のコレクションを更新する必要があります。私のViewModelはViewについて全く知りません。ビューモデルで定義された監視可能なコレクションがあります。

public class LoginViewModel: ViewModelBase
{
    public ObservableCollection<DatabaseConfiguration> DatabaseConfigurations{ get; set; }

    private DatabaseConfiguration _dbConfig;

    public DatabaseConfiguration DbConfig
    {
        get{return _dbConfig;}
        set
        {
        _dbConfig=value;
        RaisePropertyChanged(()=>DbConfig);
        }
    }

System.threading.Task コールバックを使用して、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();
    }        
}

実行時に次のエラーが発生します。

「このタイプの CollectionView は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」

MVVMLight ツールキットに別のスレッドから UI コレクションを更新するための回避策または組み込みのメカニズムはありますか?

あなたの助けは大きな助けになるでしょう!!! ありがとう!

4

3 に答える 3

2

ContinueWith()TaskScheduler を受け入れるオーバーロードがあります。wpf および winforms 用の特別なスケジューラーがあります。電話すればもらえるTaskScheduler.FromCurrentSynchronizationContext()

ここを読んでください。

SalientBrain の答えも正しいです。

于 2012-12-02T08:40:30.850 に答える
0
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    //(non)problematic statement
    DatabaseConfigurations.Add(config);
    //or perform creating of ObservableCollection
});
于 2012-12-02T08:15:06.843 に答える