2011-02-24 36 views
0

我有绑定到DomainDataSource一个DataGrid:Silverlight 4 Datagrid在新实体添加到DomainContext的实体集时不会更新。 (绑定的问题?)

<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迭代。邮箱,在函数结束时,新邮箱存在。

当我查看我的数据库时,新邮箱存在。

如果我刷新页面,新的邮箱会出现在DataGrid中。

但是,当我遍历ItemsSource时,新邮箱没有出现(它不应该与DomainContext.Mailboxes相同,因为我设置它们相等?)。新邮箱不会出现在网格中。

任何帮助将是美好的。

提前致谢!

回答

0

我最喜欢的方式来做到这一点如下:

InboxNotifierDomainContext _context = mailboxDomainDataSource.DomainContext as InboxNotifierDomainContext; 

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

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

不妨利用C#事件驱动!

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); 
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; 
    }); 
} 
相关问题