C # Entity Framework - Связанный список данных с привязкой не отражает изменения, сделанные после .SaveChanges () - PullRequest
1 голос
/ 15 июля 2010

Хорошо, это сводило меня с ума в течение последних двух дней!

Я новичок в C # и учил себя, написав простое приложение.

У меня есть простая форма, которая состоит из комбинированного списка и двух текстовых полей.В выпадающем списке содержится список объектов в таблице базы данных.Текстовые поля позволяют пользователю добавлять новые записи.Это просто список имен (имя и фамилия).

В форме находятся три кнопки для добавления, изменения и удаления.

За кулисами я использую привязку данных и WPF.

Хорошо, моя проблема заключается в следующем ..

И для операции удаления, и для изменения все работает так, как я ожидал.База данных изменяется соответствующим образом, и (что важно), выпадающий список мгновенно отражает изменения, сделанные в объекте, связанном с данными.

НО, когда я создаю и добавляю новый объект, база данных обновляется в соответствии с новым элементом, НО в комбинированном окне НЕпоказать новый объект (имя) в своем списке.Вы должны выйти из формы и вернуться, чтобы комбинированный список правильно отображал таблицу базы данных с новым добавленным элементом.

Может кто-нибудь сказать мне, как правильно получить элемент управления с привязкой к данным для отраженияВСТАВИТЬ изменение в таблицу, к которой оно привязано?

соответствующие фрагменты кода ниже ...

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.myContext = new myEntities();
        // bind the contents of the table to the combobox
        myComboBox.DataContext = myContext.myPeople;
    }

     private void myComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Update the text boxes to reflect the currently selected name
        this.person = myComboBox.SelectedItem as myPerson;

        if (this.person != null)
        {
            tbFirstName.Text = this.person.Firstname;
            tbSurname.Text = this.person.Surname;
        }
    }

    //User actions...

    if (userAction == crudAction.Modify)
    {
         // Update via the Entity Framework
         person.Firstname = tbFirstName.Text;
         person.Surname = tbSurname.Text;
         msg = "Person details modified";
    }

    if (userAction == crudAction.Add)
    {
         person = new myPerson();
         person.Firstname = tbFirstName.Text;
         person.Surname = tbSurname.Text;
         person.idPeople = 0; //Autoincremented db key
         myContext.myPeople.AddObject(person);

         msg = "New person added";
    }

    if (userAction == crudAction.Delete)
    {
         myContext.myPeople.DeleteObject(person);
         msg = "Person deleted";
    }
    myContext.SaveChanges();

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Обновляется ли оно, если вы запрашиваете БД после выполнения SaveChanges()?

var test = myContext.myPeople.ToList();

Редактировать:

Установить ItemsSource для ComboBox снова вместо:

myComboBox.ItemsSource = context.myPeople.ToList();
0 голосов
/ 04 июля 2011

Вы можете использовать события для обновления Combobox SourceItems на родительской странице, которая отображает

т.е. в вашем пользовательском элементе управления или форме, которая обрабатывает создание нового элемента

    public static readonly RoutedEvent NewItemAddedEvent =
        EventManager.RegisterRoutedEvent("NewItemAdded", RoutingStrategy.Bubble,
            typeof(RoutedEventHandler), typeof(CloseableTabItem));

    public event RoutedEventHandler NewItemAdded
    {
        add { AddHandler(NewItemAddedEvent, value); }
        remove { RemoveHandler(NewItemAddedEvent, value); }
    }

private void SaveButton_Click (отправитель объекта, RoutedEventArgs e) { ProActive.Contact currentContact = (ProActive.Contact) ItemsListBox.Items.CurrentItem;

        switch (MessageBox.Show("Are you sure?", "Save Changes", MessageBoxButton.YesNoCancel))
        {
            case MessageBoxResult.Yes:
                if (currentContact.EntityState == System.Data.EntityState.Detached)
                    ProActive.App.ProActiveDatabaseEntities.Contacts.AddObject(currentContact);
                ProActive.App.ProActiveDatabaseEntities.SaveChanges();

                this.RaiseEvent(new RoutedEventArgs(NewItemAddedEvent, this));

                break;
}

затем на главной странице, которая отображает поле со списком, прикрепите событие, которое сработало после «сохранения» нового элемента

ProActive.TabPagesControls.AllContactsDetailsControl cdc = new AllContactsDetailsControl();
cdc.NewItemAdded += AllContactsDetailsNewItemAdded;

затем обрабатывает событие на родительской странице после его запуска для повторной загрузки источника элементов

  private void AllContactsDetailsNewItemAdded(object sender, RoutedEventArgs e)
    {
        // New item added so refresh the items listbox
        AllContactListItemsListBox.ItemsSource = from c in  ProoActive.App.ProActiveDatabaseEntities.Contacts select c;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...