3

プロジェクト概要

2 つの ObserverableCollection を含むビューモデルにバインドするビューがあります。ビューモデル コンストラクターは最初の ObserverableCollection にデータを入力し、ビューのデータ コンテキストが収集されて、Sites というパブリック プロパティを介してバインドされます。

その後、2ed ObserverableCollection が LoadOrders メソッドに取り込まれ、パブリック プロパティ LoadFraudResults が更新されてデータ コンテキストにバインドされます。

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

VIEWMODEL ソース

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

}


ソースを表示

パブリック部分クラス OrderQueueControl : UserControl {

    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

 ComboBox x:Name="cmbWebsite" ItemsSource="{Binding Sites}"  Margin="5" 
 Width="100" Height="25" SelectionChanged="cmbWebsite_SelectionChanged"
 DataGrid ItemsSource ={Binding Path = LoadFraudResults}

問題の領域:

LoadOrderQueueForm を呼び出して最初の observablecollection をバインドし、後で BindItemsSource を呼び出して 2ed の監視可能なコレクションをバインドすると、すべてが正常に機能し、初めてのバインドでは問題ありません。

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

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

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

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

過去2日間このことで立ち往生していて、締め切りが近づいているので助けてください.

前もって感謝します

4

2 に答える 2

5

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

于 2009-07-10T08:13:43.063 に答える
3

はい、ilu2009 は正しいです。

MVVM モーダルを使用してDataGridにバインドし、DataGrid.ItemsSource内のオブジェクトを変更するには、UI に反映するためにDataGrid.ItemsSource.Refresh ()が必要です。

于 2010-04-16T15:32:04.630 に答える