我有一个绑定到DomainDataSource的DataGrid:
<sdk:DataGrid AutoGenerateColumns="False" Height="Auto"
ItemsSource="{Binding ElementName=mailboxDomainDataSource, Path=Data,Mode=TwoWay}"
Name="mailboxHeaderDataGrid"....>...</sdk>
我还有一个添加按钮来添加新行:
private void addMailboxButton_Click(object sender, RoutedEventArgs e)
{
Mailbox m = new Mailbox();
InboxNotifierDomainContext context = (InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext;
((InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext).Mailboxes.Add(m);
if (!mailboxDomainDataSource.DomainContext.IsSubmitting) if (mailboxDomainDataSource.HasChanges) mailboxDomainDataSource.SubmitChanges();
mailboxHeaderDataGrid.ItemsSource = ((InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext).Mailboxes;
foreach (Mailbox m1 in ((InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext).Mailboxes)
{
MessageBox.Show(m1.MailboxID + '-' + m1.MailBox1);
}
}
现在,当我遍历DomainContext.Mailboxes时,就像在函数末尾一样,新邮箱存在。
当我查看我的数据库时,新邮箱存在。
如果我刷新页面,新邮箱将出现在DataGrid中。
然而,当我遍历ItemsSource时,新邮箱不会出现(不应该与DomainContext.Mailboxes相同,因为我将它们设置为相同?)。并且新邮箱不会出现在网格中。
任何帮助都会很棒。
提前致谢!
答案 0 :(得分:0)
您可以尝试在代码中添加以下行,在分配新代码之前设置ItemsSource = null:
// Set ItemsSource to null
mailboxHeaderDataGrid.ItemsSource = null;
// Assign new ItemsSource
mailboxHeaderDataGrid.ItemsSource = ((InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext).Mailboxes;
但是,看看xaml和代码,我认为你有一些不一致的地方。
在您的xaml中,您使用Binding ElementName=mailboxDomainDataSource, Path=Data
,并在您的代码中指定一个新的ItemsSource。
我认为更简洁的方法是使用ObservableCollection<Mailbox>
(命名空间System.Collections.ObjectModel)作为ItemsSource,并用DomainDataSource的结果填充它。使用DomainDataSource.LoadedData-Event并复制结果。 (像这样,没有经过测试:)
private ObservableCollection<Mailbox> _mailboxCollection = new ObservableCollection<Mailbox>();
public ObservableCollection<Mailbox> MailboxCollection { ... }
private void DomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
{
if (e.HasError)
{
// Error handling
}
else
{
if (e.Entities.Count > 0)
{
this.MailboxCollection = new ObservableCollection(e.Entities);
}
}
}
然后,当您添加新邮箱时,您可以执行以下操作:
((InboxNotifierDomainContext)mailboxDomainDataSource.DomainContext).Mailboxes.Add(m);
this.MailboxObservableCollection.Add(m);
答案 1 :(得分:0)
这是更好的方法,
private void addMailboxButton_Click(object sender, RoutedEventArgs e)
{
Mailbox m = new Mailbox();
mailboxDomainDataSource.DataView.Add(m);
// it takes a little while for Datagrid to update so
// we will queue our selection logic
Dispatcher.BeginInvoke( ()=>{
mailBoxGrid.SelectedItem = m;
} );
}
答案 2 :(得分:0)
我最喜欢这样做的方法如下:
InboxNotifierDomainContext _context = mailboxDomainDataSource.DomainContext as InboxNotifierDomainContext;
_context.EntityContainer.GetEntitySet<Mailbox>().EntityAdded += (s,e) => {mailBoxGrid.ItemsSource = mailboxDomainDataSource.DomainContext.EntityContainer.GetEntitySet<Mailbox>();};
或者,您可以使用事件参数来获取添加的实体,将其作为邮箱投射,并将其投射到ItemsSource - 这只是一种懒惰的方式。
也可以利用C#进行事件驱动!