2009-08-20 58 views
0

好的,這對我來說是個頭疼的問題。我有一個列表框,我像這樣綁定到LINQ查詢:將項目添加到綁定的WPF列表框

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的)

一切都顯示了偉大的,我有一個數據綁定形式允許您編輯一條記錄,所有這些更改都可以正常工作,修改後的數據顯示在列表中。

問題出在我添加一個項目。列表中沒有顯示任何內容。數據正常進入數據庫,但查看數據的唯一方法是關閉並重新啓動我的應用程序。我使用下面的代碼爲例:

 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。這將通知列表框有關列表中的任何更改並自動刷新它。

從MSDN

在很多情況下,你一起工作 的數據對象的集合。例如,對於 示例,數據 綁定中的常見方案是使用ItemsControl (如ListBox,ListView或TreeView)來顯示 記錄的集合。

P.S.您不需要數據庫刷新

+0

使用ObservableCollection將不足以解決問題,需要再次對數據庫運行查詢 – 2009-08-20 16:03:29

2

除非另有通知,否則ListBox僅在其ItemsSource上迭代一次。您的查詢只能運行一次。

查詢對象不知道數據庫何時更改(並且Refresh不起作用;請參見下文) - 由您來決定(或預期)並在適當的時間重新運行相關查詢。

Stan R提到ObservableCollection。這很好,但只是將查詢結果存儲在ObservableCollection中不會解決問題,除非您在數據庫更改時自己更新集合。這意味着重新運行查詢並手動添加新項目並從集合中刪除已刪除的項目。 (您可以選擇重新運行查詢並將整個結果重新設置到列表框中,但這意味着將創建一組全新的項目 - 不是非常高效,也可能不是您想要的其他原因。)

順便說一句,您撥打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); 

我花了一些時間來圖我不得不手動更新列表(感謝Ben),但似乎一切正常。排序會很好,但我會再擔心一次。

相關問題