Silverlight 4 Datagrid не обновляется, когда новая сущность добавляется в набор сущностей DomainContext. (Обязательная проблема?) - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть DataGrid, привязанный к DomainDataSource:

<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.

Однако , когда я перебираю ItemSource, новый почтовый ящик не появляется (не должен ли он совпадать с DomainContext.Mailboxes, поскольку я установил их равными?) И новый почтовый ящик не отображается в сетке.

Любая помощь была бы замечательной.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 21 мая 2011

Это лучший способ сделать это,

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;
     } );
}
0 голосов
/ 07 декабря 2011

Мой любимый способ сделать это заключается в следующем:

InboxNotifierDomainContext _context = mailboxDomainDataSource.DomainContext as InboxNotifierDomainContext;

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

В качестве альтернативы, вы можете использовать аргументы события, чтобы получить добавленную сущность, привести ее в качестве почтового ящика и передать ее в ItemsSource - thisэто был просто ленивый путь.

Можно также воспользоваться преимуществами C #, управляемыми событиями!

0 голосов
/ 26 февраля 2011

Вы можете попробовать добавить следующую строку в ваш код, установив 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);
...