当新实体添加到DomainContext的实体集时,Silverlight 4 Datagrid不会更新。 (绑定问题?)

时间:2011-02-24 15:04:44

标签: silverlight silverlight-4.0 datagrid wpfdatagrid

我有一个绑定到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相同,因为我将它们设置为相同?)。并且新邮箱不会出现在网格中。

任何帮助都会很棒。

提前致谢!

3 个答案:

答案 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#进行事件驱动!