我开始了一个新的WPF项目,在主窗口我有一个按钮。当我单击它时,我会显示一个新窗口,显示如下: 1个textBox(名为tbTax) 1添加按钮 1 DataGrid(名为dbGrid)
我通过转到DataSources选项卡获取了DataGrid,并从表单/窗口中的表中获取了DRAG / DROP。 当我运行应用程序时,它都按计划运行。在第二个窗口中,我在网格中看到了数据库表中的所有记录。
现在: 我为“添加按钮”添加了代码。因此,当用户在textBox(tbTax)中输入一些文本并单击Add按钮时,会出现以下代码:
using (MyEntities context = new MyEntities())
{
TAX tax = new TAX();
tax.TAX1 = decimal.Parse(tbTax.Text);
context.TAXs.Add(tva);
context.SaveChanges();
tbTax.Text = "";
dbGrid.Items.Refresh();
}
所以应该很明显:我通过实体框架将一个项添加到数据库表中。 但即使我在代码末尾添加了刷新部分......网格也不会刷新。因此,只有当我退出窗口并重新显示它时,才会看到我刚刚添加的新项目。
修改 在拖放之后我最终得到了这个:
- XAML -
<DataGrid x:Name="tAXDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="10,157,10,35" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn x:Name="tAXColumn1" Binding="{Binding TAX}" Header="TAX" Width="SizeToHeader"/>
</DataGrid.Columns>
</DataGrid>
- XAML.cs -
private void Window_Loaded(object sender, RoutedEventArgs e)
{
TestXXX.ArtDataSet artDataSet = ((TestXXX.ArtDataSet)(this.FindResource("artDataSet")));
// Load data into the table TAX. You can modify this code as needed.
TestXXX.ArtDataSetTableAdapters.TAXTableAdapter artDataSetTAXTableAdapter = new TestXXX.ArtDataSetTableAdapters.TAXTableAdapter();
artDataSetTAXTableAdapter.Fill(artDataSet.TAX);
System.Windows.Data.CollectionViewSource tAXViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("tAXViewSource")));
tAXViewSource.View.MoveCurrentToFirst();
}
此外,我的上下文是单独声明的
namespace TestXXX
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class ArtEntities : DbContext
{
public ArtEntities()
: base("name=ArtEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<BOOK> BOOKs { get; set; }
public DbSet<TAX> TAXs { get; set; }
}
}
和TAX类是
namespace TestXXX
{
using System;
using System.Collections.Generic;
public partial class TAX
{
public TAX()
{
this.BOOKs = new HashSet<BOOK>();
}
public int ID { get; set; }
public Nullable<decimal> TAX1 { get; set; }
public virtual ICollection<BOOK> BOOKs { get; set; }
}
}
这有什么问题?我该如何解决?
答案 0 :(得分:1)
首先,我假设您只处于学习阶段,因为将所有图层放入UI控件并不是一个好主意。数据层(与数据库通信)应与模型分离,模型应与视图分开。当然还有许多其他设计,但分离是所有这些设计的核心问题。
在使用WPF时,您应该知道System.Collection.ObjectModel中包含的ObservableCollection。此集合通知数据用户(主要是wpf中的UI控件)有关集合中的更改,如添加,删除等。
所以你需要做的是使用ObservableCollection设置DataGrid的ItemSource。您接下来要做的只是将税项添加到此集合中并将其保存到数据库中。没什么。
答案 1 :(得分:0)
解决方案似乎很简单...... 在Window的CS文件中
public partial class NewTAX : Window
{
ArtEntities db;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
db = new ArtEntities();
dbgrid.ItemsSource = db.TAXs.ToList();
}
...然后在添加新项目后,只需将ItemSource设置为:
using (MyEntities context = new MyEntities())
{
TAX tax = new TAX();
tax.TAX1 = decimal.Parse(tbTax.Text);
context.TAXs.Add(tva);
context.SaveChanges();
tbTax.Text = "";
dbgrid.ItemsSource = db.TAXs.ToList();
}