2009-08-20 3 views
0

Хорошо, это было для меня головным скрестом. У меня есть ListBox Я связывающийся с запросом LinQ как так:Добавление элемента в связанный WPF ListBox

private IQueryable<Feed> _feeds; 

    public IQueryable<Feed> Feeds 
    { 
     get 
     { 
      if (_feeds == null) 
      { 
       var feedsQuery = from f in _db.Feed orderby f.Title select f; 
       _feeds = feedsQuery; 
      } 
      return _feeds; 
     } 
    } 

    public Options() 
    { 
     InitializeComponent(); 
     this.DataContext = Feeds; 
    } 

(Для записи я также попробовал список, вместо IQueryable)

Все показывает вверх большой и у меня есть форма DataBound который позволяет редактировать запись, и все эти изменения работают очень хорошо, измененные данные отображаются в списке.

Проблема возникает с добавлением товара. В списке ничего не отображается. Данные поступают в базу данных отлично, но единственный способ увидеть данные - это закрыть и перезапустить мое приложение. Я использую код ниже в качестве примера:

 Feed feed = new Feed() 
     { 
      ID = Guid.NewGuid(), 
      Url = "http://www.test.com", 
      Title = "Test" 
     }; 
     _db.Feed.InsertOnSubmit(feed); 
     _db.SubmitChanges(); 
     _db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

(с или без _db.Refresh ничего не происходит)

Что происходит?

ответ

4

Вы все делаете правильно, вам нужно использовать ObservableCollection. Это будет уведомлять ListBox о любых изменениях в списке и обновлять его автоматически.

Из MSDN

Во многих случаях данные, которые работают с представляет собой совокупность объектов. Например, для общим сценарием в привязке данных является использование ItemsControl , такого как ListBox, ListView или TreeView для отображения коллекции записей .

P.S. вам не нужно обновлять db

+0

Использование ObservableCollection будет недостаточным для решения проблемы, запрос необходимо снова запустить с базой данных –

2

Если не указано иное, то ListBox выполняет только итерацию над своим ItemsSource. Ваш запрос запускается только один раз.

Объект запроса не знает, когда изменяется база данных (и Refresh не помогает, см. Ниже) - вам решать (или предвидеть) это и повторно запускать соответствующие запросы в соответствующие моменты времени.

Ст. R упоминает ObservableCollection. Это нормально, но просто сохранение результата вашего запроса в ObservableCollection не решит проблему, если вы не выполните некоторую работу по обновлению коллекции самостоятельно при изменении базы данных. Это означает повторение запроса и добавление новых элементов вручную и удаление удаленных элементов из коллекции. (Вы могли бы просто повторно запустить запрос и вернуть весь результат в ListBox, но это означает, что будет создан целый новый набор элементов - не очень эффективный и, возможно, не тот, который вы хотите по другим причинам.)

В качестве альтернативы, ваш звонок DataContext.Refresh, вероятно, не делает то, что вы думаете. Из документов:

Этот метод полезен после ошибки оптимистического параллелизма, чтобы принести элементы в состояние для другой попытки. Он обновляет состояние примитивных полей и свойств объектов.

0

Хорошо.Я не уверен, это 100% правильный способ использовать ObservableCollection, но это похоже на работу:

private ObservableCollection<Feed> _feeds; 
     public ObservableCollection<Feed> Feeds 
     { 
      get 
      { 
       if (_feeds == null) 
       { 
        var feedsQuery = from f in _db.Feed orderby f.Title select f; 
        _feeds = new ObservableCollection<Feed>(); 
        foreach (var item in feedsQuery) 
        { 
         _feeds.Add(item); 
        } 
       } 
       return _feeds; 
      } 
     } 

И добавить свой предмет:

Feed feed = new Feed() 
      { 
       ID = Guid.NewGuid(), 
       Url = "http://www.test.com", 
       Title = "Test" 
      }; 
      _db.Feed.InsertOnSubmit(feed); 
      _db.SubmitChanges(); 
      // manually update the list 
      Feeds.Add(feed); 

меня ушло некоторое время на рисунке я должен был обновить список вручную (спасибо Бен), но все это работает. Сортировка была бы неплохой, но я буду беспокоиться об этом в другой раз.

Смежные вопросы