2011-07-22 15 views
3

GUI上にデータソースにバインドされたGridView要素があります。私はINotifyPropertyChangedを使用することにしました。自動的に更新するクラスを変更できるようにすることで対話を簡素化します。GridView.この時点までクロススレッドには何の問題もありませんでしたが、 (GridViewを変更する)が、UI以外のスレッドで発生しています。私はinvokeを使用して私の問題を解決しましたが、INotifyPropertyChangedを実装してGridViewにバインドしているとき、どのようにしたらよいか分かりません。どんな助けも非常に高く評価されるでしょう!INotifyPropertyChangedバインディングとクロススレッディングのエラー

+0

他のスレッドがディスパッチャを使用するようにUIスレッドを使用してクラスを「変更する」必要があります。 – vcsjones

+0

クラス内の変数への追加を呼び出すと、クラスが変更されます: 'class.Elements.Add(...);'。だからあなたは、ディスパッチャーを使ってその電話をかけることを言っていますか? – avivas

答えて

0

グリッドに関連付けられた観測可能なコレクションがあるとします。グリッドがビューです。

データを取得するためにコールアウトが行われると、コールアウトはデータを返すために非同期になります。非同期イベントハンドラでは、あなたのビューモデルクラスでこのような何かをしたいと思う:

/// <summary> 
    /// This is what is bound to the UI 
    /// </summary> 
    private ObservableCollection<UserDTO> _Users; 

    /// <summary> 
    /// Collection of Users 
    /// </summary> 
    public ObservableCollection<UserDTO> Users 
    { 
     get 
     { 
      return _Users; 
     } 
     set 
     { 
      if (_Users != value) 
      { 
       _Users = value; 
       OnPropertyChanged("Users"); 
      } 
     } 
    } 

    /// <summary> 
    /// Asynchronous Callback For Get Users 
    /// </summary> 
    private void UserAgentGetCompleted(object sender, List<UserDto> users) 
    { 

     //Make sure we are on the UI thread 
      this.Dispatcher.BeginInvoke(() => SetUsers(users)); 

    } 

はその後SetUsersには、ビュー(グリッド)にバインドされたデータであり、監視可能なコレクション(_Users)を更新します。観測可能なコレクションが更新されるため、変更は依存関係プロパティを介してビューにバインドされているため、ビューに反映されます。

私はSetUsers()コードを省略しましたが、受信ユーザーリストを観測可能なコレクションに設定するだけです。

関連する問題