gpt4 book ai didi

c# - 无法使用 PRISM 5、MVVM 和 EF 6 在 WPF 中刷新 DataGrid

转载 作者:行者123 更新时间:2023-12-03 10:46:04 24 4
gpt4 key购买 nike

我的问题似乎很常见,但是,对于我读过的所有帖子——无论是在这里还是在其他网站上——我仍然没有找到解决方案。

我有一个相当简单的数据输入 WPF 模块 - 2 个文本框、3 个组合框、1 个数据网格,然后是提交和清除按钮。 (该应用程序/表单用于在会计数据库中创建总分类帐帐户。)我正在使用 PRISM 5 构建我的整个解决方案。(这是我第一次尝试远程这么复杂的东西,目前,它是一个证明——概念的努力。)无论如何,我将所有 WPF 屏幕(用户控件/ View )绑定(bind)到适当的 View 模型。 ViewModel 反过来通过 EF 6 实体(DB First)从 MSSS db 获取其数据。当用户打开这个特定的 WPF 屏幕时,DataGrid 会显示数据库中的所有现有记录。

除了一个异常(exception),提交(新记录)过程按我的意愿工作:一个新条目被推送到 MSSS 数据库,文本框被清除,ComboBoxes 重置。然而,我想要的是 1)要刷新的 DataGrid,显示新记录,以及 2)在网格中突出显示该新记录。不过,就我的一生而言,我无法让它发挥作用。注意:DataGrid 绑定(bind)到数据库中的 View 而不是表可能会有所不同。 (同样,当应用程序首次打开时,DataGrid 会正确显示。)

那么,如何让 DataGrid 更新????

这是 WPF View 的(精简)XAML:

    <UserControl x:Class="AcctMappingWpfModule.Views.CreateGLAcctsView"
other namespace declarations...
xmlns:vms="clr-namespace:AcctMappingWpfModule.ViewModels">
<UserControl.DataContext>
<vms:CreateGLAcctsViewModel />
</UserControl.DataContext>
...
<StackPanel ...>
<!-- Layout controls for 2 Text boxes & 3 ComboBoxes -->
...
<!-- Data grid of all Genl Ledger accts -->
<DataGrid x:Name="dgGLAccts"
IsReadOnly="True"
SelectionUnit="FullRow"
...
ItemsSource="{Binding Path=GLAccounts}" />
<WrapPanel >
<!-- Submit & Clear Buttons here -->
</WrapPanel>
</StackPanel>

这是(精简的)ViewModel 代码(省略了 try/catch block ):
    namespace AcctMappingWpfModule.ViewModels

{
公共(public)类 CreateGLAcctsViewModel : BindableBase, ICreateGLAcctsViewModel
{
私有(private) TBLOADEntities 上下文;
私有(private) int _glAcctID = 0;
//其他私有(private)字段...
// Ctor...
public CreateGLAcctsViewModel( )
{
this.SubmitCommand = new DelegateCommand(OnSubmit);

// Populate ICollectionViews - i.e., properties...
using (context = new TBLOADEntities())
{
// 3 properties behind ComboBoxes populated, then the DataGrid ppt...
List<vwGLAcct> accts = new List<vwGLAcct>();
accts = (from a in context.vwGLAcct select a).ToList<vwGLAcct>();
GLAccounts = CollectionViewSource.GetDefaultView(accts);
}

// Hook up selection change delegates, including...
GLAccounts.CurrentChanged += GLAccounts_CurrentChanged;
}

private void OnSubmit()
{
GLAccount glAcct = new GLAccount()
{
// Various properties set, then...
GlFsAcctTypeComboFK = this.SelectedFSAcctTypeComboID
};
using (context = new TBLOADEntities())
{
context.GlAcct.Add(glAcct);
context.SaveChanges();
// vwGLAcct is the EF entity of the MSSS db view...
List<vwGLAcct> accts = new List<vwGLAcct>();
accts = (from a in context.vwGLAcct select a).ToList<vwGLAcct>();
GLAccounts = CollectionViewSource.GetDefaultView(accts);
SelectedGLAcctID = glAcct.GlAcctID;
GLAccounts.Refresh();
}
}

private void GLAccounts_CurrentChanged(object sender, EventArgs e)
{
vwGLAcct current = GLAccounts.CurrentItem as vwGLAcct;
SelectedGLAcctID = current.GlAcctID;
}

public ICommand SubmitCommand { get; private set; }

public int SelectedGLAcctID
{
get
{ return _glAcctID; }
set
{
SetProperty(ref _glAcctID, value);
}
}

public ICollectionView GLAccounts { get; private set; }
}

}

最佳答案

1)你为什么再次获得默认 View ? (CollectionViewSource.GetDefaultView(accts)) 提交后?确保 accts 是 ObservableCollection 并且只获取一次默认 View ,然后点击刷新它。

2)那是Window背后的代码吗?如果是这样,dgGLAccts.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget()

关于c# - 无法使用 PRISM 5、MVVM 和 EF 6 在 WPF 中刷新 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750861/

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