WPF DataContext не обновляет DataGrid с использованием модели MVVM - PullRequest
3 голосов
/ 25 мая 2009

Обзор проекта

У меня есть представление, которое привязывается к модели представления, содержащей 2 ObserverableCollection. Конструктор viewmodel заполняет первую коллекцию ObserverableCollection, и текст данных представления собирается для привязки к нему через открытое свойство Sites.

Позже 2ed 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();
    }

}


ПОСМОТРЕТЬ ИСТОЧНИК

открытый частичный класс 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   

}

1022 * XAML *

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

ПРОБЛЕМА:

Когда я вызываю LoadOrderQueueForm, чтобы связать первую наблюдаемую коллекцию, а затем BindItemsSource, чтобы связать 2ed наблюдаемую коллекцию, все работает нормально и в первый раз связывание не вызывает проблем.

Но, когда я снова вызываю BindItemsSource для повторного заполнения коллекции obseravablecollection на основе измененного выбранного комбинированного значения с помощью cmbWebsite_SelectionChanged, в поле наблюдаемого сбора добавляется новое значение, а свойство LoadFraudResults в viewmodule заполняется новыми значениями; но когда я вызываю текстовый текст для повторной привязки сетки данных, сетка данных не отражает измененные значения.

Другими словами, сетка данных не изменяется, когда datacontext вызывается как 2ed time в методе BindItemsSource представления.

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

значения manageFraudOrderViewModel верны, но сетка данных не освобождается с измененными значениями.

Пожалуйста, помогите, поскольку я застрял с этим в течение последних 2 дней, и крайний срок приближается.

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 10 июля 2009

попробуйте использовать datagrid.Items.Refresh ()!

3 голосов
/ 16 апреля 2010

Да, ilu2009 правильный.

Привязка с использованием модального MVVM к DataGrid и изменение объектов в DataGrid.ItemsSource требует DataGrid.ItemsSource.Refresh () для отражения пользовательский интерфейс.

...