3

项目概况

我有一个视图绑定到包含 2 ObserverableCollection 的视图模型。viewmodel 构造函数填充第一个 ObserverableCollection 并收集视图数据上下文以通过名为 Sites 的公共属性绑定到它。

稍后在 LoadOrders 方法中填充 2ed ObserverableCollection,并更新公共属性 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();
    }

}


查看源

公共部分类 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 observable 集合时,一切正常,第一次绑定没有问题。

但是,当我再次调用 BindItemsSource 以通过 cmbWebsite_SelectionChanged 根据更改的选定组合值重新填充 obseravablecollection 时,observalblecollection 将填充新值,并且 viewmodule 中的 LoadFraudResults 属性填充有新值;但是当我调用数据上下文重新绑定数据网格时,数据网格不会反映更改的值。

换句话说,当在视图的 BindItemsSource 方法中调用数据上下文时,数据网格不会更改。

 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 中的对象需要DataGrid.ItemsSource.Refresh ()才能反映在 UI 上。

于 2010-04-16T15:32:04.630 回答