gpt4 book ai didi

WPF DataContext不使用MVVM模型刷新DataGrid

转载 作者:行者123 更新时间:2023-12-02 08:40:37 26 4
gpt4 key购买 nike

项目概述

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

稍后,2ed ObserverableCollection 会填充到 LoadOrders 方法中,并且更新公共(public)属性 LoadFraudResults 以将其与数据上下文绑定(bind)。

我正在使用 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();
}

}

<小时/>

查看源码

公共(public)分部类 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 绑定(bind)第一个 observablecollection 并随后调用 BindItemsSource 绑定(bind) 2ed observable 集合时,一切正常,第一次绑定(bind)没有问题。

但是,当我再次调用 BindItemsSource 以通过 cmbWebsite_SelectionChanged 根据更改的选定组合值重新填充 obseravablecollection 时,observalblecollection 会填充新值,并且 viewmodule 中的 LoadFraudResults 属性会填充新值;但是当我调用 datacontext 重新绑定(bind)数据网格时,数据网格没有反射(reflect)更改后的值。

换句话说,当在 View 的 BindItemsSource 方法中调用数据上下文 2 次时,数据网格不会发生更改。

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

manageFraudOrderViewModel 值正确,但数据网格未反射(reflect)更改的值。

请帮忙,因为过去两天我一直在处理这件事,而且截止日期即将来临。

提前致谢

最佳答案

尝试使用datagrid.Items.Refresh()!

关于WPF DataContext不使用MVVM模型刷新DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/907521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com