Обзор проекта
У меня есть представление, которое привязывается к модели представления, содержащей 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 дней, и крайний срок приближается.
Заранее спасибо