2009-05-25 8 views
3

プロジェクトの概要WPFのDataContextは、私は2 ObserverableCollectionを含むのviewmodelに結合するビューを持っているMVVMモデルに

を使用してデータグリッドをリフレッシュしません。 viewmodelコンストラクタは最初のObserverableCollectionにデータを取り込み、datacontextはSitesというパブリックプロパティを通じてバインドされたビューを生成します。

2he ObserverableCollectionがLoadOrdersメソッドに設定され、パブリックプロパティLoadFraudResultsがdatacontextとバインドされるように更新されます。

私はWCFを使用してデータベースからデータを取得しています。そのデータは非常にうまく抽出されています。

ビューモデル源

class ManageFraudOrderViewModel:ViewModelBase 
{ 
    #region Fields   
    private readonly ICollectionView collectionViewSites; 
private readonly ICollectionView collectionView; 
    private ObservableCollection<GeneralAdminService.Website> _sites; 
    private ObservableCollection<FraudService.OrderQueue> _LoadFraudResults; 

    #endregion 

    #region Properties 
    public ObservableCollection<GeneralAdminService.Website> Sites 
    { 
     get { return this._sites; } 
    } 
    public ObservableCollection<FraudService.OrderQueue> LoadFraudResults 
    { 
     get { return this._LoadFraudResults;} 
    } 
    #endregion 

    public ManageFraudOrderViewModel() 
    { 
     //Get values from wfc service model 
     GeneralAdminService.GeneralAdminServiceClient generalAdminServiceClient = new GeneralAdminServiceClient(); 
     GeneralAdminService.Website[] websites = generalAdminServiceClient.GetWebsites(); 
     //Get values from wfc service model    

     if (websites.Length > 0) 
     { 
      _sites = new ObservableCollection<Wqn.Administration.UI.GeneralAdminService.Website>(); 
      foreach (GeneralAdminService.Website website in websites) 
      { 
       _sites.Add((Wqn.Administration.UI.GeneralAdminService.Website)website); 
      } 

    this.collectionViewSites= CollectionViewSource.GetDefaultView(this._sites); 
     } 
     generalAdminServiceClient.Close(); 
    } 

    public void LoadOrders(Wqn.Administration.UI.FraudService.Website website) 
    { 
     //Get values from wfc service model    
     FraudServiceClient fraudServiceClient = new FraudServiceClient(); 
     FraudService.OrderQueue[] OrderQueue = fraudServiceClient.GetFraudOrders(website); 
     //Get values from wfc service model    

     if (OrderQueue.Length > 0) 
     { 
      _LoadFraudResults = new ObservableCollection<Wqn.Administration.UI.FraudService.OrderQueue>(); 
      foreach (FraudService.OrderQueue orderQueue in OrderQueue) 
      { 
       _LoadFraudResults.Add(orderQueue); 
      } 
     } 

    this.collectionViewSites= CollectionViewSource.GetDefaultView(this._LoadFraudResults); 
     fraudServiceClient.Close(); 
    } 

}


VIEW源

パブリックパーシャルクラスOrderQueueControl:ユーザーコントロール {

private ManageFraudOrderViewModel manageFraudOrderViewModel ; 
    private OrderQueue orderQueue; 
    private ButtonAction ButtonAction; 
    private DispatcherTimer dispatcherTimer; 

    public OrderQueueControl() 
    { 

      LoadOrderQueueForm(); 
    } 

    #region LoadOrderQueueForm 
    private void LoadOrderQueueForm() 
    {  
    //for binding the first observablecollection 
     manageFraudOrderViewModel = new ManageFraudOrderViewModel(); 
     this.DataContext = manageFraudOrderViewModel;   
    } 
    #endregion 

    private void cmbWebsite_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     BindItemsSource(); 
    } 

    #region BindItemsSource 
    private void BindItemsSource() 
    { 
     using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait)) 
     { 

      if (!string.IsNullOrEmpty(Convert.ToString(cmbWebsite.SelectedItem))) 
      { 
        Wqn.Administration.UI.FraudService.Website website = (Wqn.Administration.UI.FraudService.Website)Enum.Parse(typeof(Wqn.Administration.UI.FraudService.Website),cmbWebsite.SelectedItem.ToString()); 

     //for binding the second observablecollection******* 
        manageFraudOrderViewModel.LoadOrders(website); 
        this.DataContext = manageFraudOrderViewModel; 
     //for binding the second observablecollection******* 
      }    
     } 
    } 
    #endregion 

}

XAML

コンボボックスX:NAME = "cmbWebsite" のItemsSource = "{結合部位}" マージン= "5" 幅= "100" 高さ= "25" SelectionChanged = "cmbWebsite_SelectionChanged"

のDataGridのItemsSource = {バインディングパス= LoadFraudResults}

問題領域:

私は2ED監視可能なコレクションをバインドする最初のObservableCollection以降BindItemsSourceをバインドするLoadOrderQueueFormを呼び出して、すべてが正常に動作していないprobl最初のバインディングのためのem。

しかし、cmbWebsite_SelectionChangedによって変更された選択されたコンボ値に基づいてobseravablecollectionを再度埋め込むためにBindItemsSourceを呼び出すと、observalblecollectionに新しい値が設定され、viewmoduleのLoadFraudResultsプロパティに新しい値が設定されます。 datagridを再バインドするためにdatacontextを呼び出すと、データグリッドは変更された値を反映しません。

つまり、ビューのBindItemsSourceメソッドでdatacontextが2回呼び出されたときに、データグリッドは変更されません。

manageFraudOrderViewModel.LoadOrders(website);
this.DataContext = manageFraudOrderViewModel;

manageFraudOrderViewModelの値は正しいですが、データグリッドは変更された値で再選択されません。

私は過去2日間このことに固執しており、期限が近づいていますのでお手伝いください。事前

答えて

5

おかげでdatagrid.Items.Refresh()を使用してみてください!

+0

これは大変迷惑です!!!!!! –

+0

これは解決策ではありません。 –

3

はい、ilu2009は正しいです。それはUIに反映するため

データグリッドにMVVMモーダルを使用して結合およびDataGrid.ItemsSource内のオブジェクトを変更することは、DataGrid.ItemsSource.Refresh()を必要とします。

関連する問題