【问题标题】:Silverlight 4 Datagrid not updating when new entity added to DomainContext's entity set. (Binding problem?)将新实体添加到 DomainContext 的实体集中时,Silverlight 4 Datagrid 未更新。 (绑定问题?)
【发布时间】:2011-02-24 15:04:43
【问题描述】:

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

任何帮助都会很棒。

提前致谢!

【问题讨论】:

    标签: silverlight silverlight-4.0 datagrid wpfdatagrid


    【解决方案1】:

    您可以尝试在代码中添加以下行,在分配新的之前设置 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&lt;Mailbox&gt;(命名空间 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);
    

    【讨论】:

      【解决方案2】:

      这是更好的方法,

      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;
           } );
      }
      

      【讨论】:

        【解决方案3】:

        我最喜欢的方法如下:

        InboxNotifierDomainContext _context = mailboxDomainDataSource.DomainContext as InboxNotifierDomainContext;
        
        _context.EntityContainer.GetEntitySet<Mailbox>().EntityAdded += (s,e) => {mailBoxGrid.ItemsSource = mailboxDomainDataSource.DomainContext.EntityContainer.GetEntitySet<Mailbox>();};
        

        或者,您可以使用事件 args 来获取添加的实体,将其转换为邮箱并将其转换为 ItemsSource——这只是一种懒惰的方式。

        不妨利用 C# 事件驱动的优势!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-05
          • 2012-09-25
          • 2015-01-26
          相关资源
          最近更新 更多