2012-05-02 41 views
0

我正在編寫一個程序來查看列表框中的產品信息。我有一個用於搜索的文本框,可以在按ProductName鍵入時自動篩選列表。我已經運行了很多次C#代碼,並且我可以看到過濾器實際上正在工作,但我無法通過視覺方式在屏幕上過濾或「刷新」。爲什麼列表框項目在過濾期間沒有更新?

C#代碼:

private ICollectionView _ProductInfoView; 
    public ICollectionView ProductInfoView 
    { 
     get{return this._ProductInfoView;} 
     set 
     { 
      this._ProductInfoView=value; 
      this.onPropertyChnage("ProductInfoView"); 
     } 
    } 

private void RibbonSetupProduct_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     this.hidePanels(); 
     new Task(() => 
     { 
      this.Dispatcher.Invoke(new Action(() => 
      { 
       ObservableCollection<ModelProductInformation> productInfoCollection = new ObservableCollection<ModelProductInformation>(from ProductInfo in new GTS_ERPEntities().ProductInformations select new ModelProductInformation { ProductID = ProductInfo.ProductID, ProductName = ProductInfo.ProductName , Remark=ProductInfo.Remark}); 
       this.ProductInfoView = CollectionViewSource.GetDefaultView(productInfoCollection); 
       new ProductInfoSearch(ProductInfoView, this.TestTextBox); 
      } 
       ), DispatcherPriority.DataBind); 
     } 
     ).Start(); 

     this.PanelProducts.Visibility = Visibility.Visible; 
    } 

    class ProductInfoSearch 
    { 
     public ProductInfoSearch(ICollectionView filteredList, TextBox textEdit) 
     { 
     string filterText = string.Empty; 

     filteredList.Filter = delegate(object obj) 
     { 
      if (String.IsNullOrEmpty(filterText)) 
      { 
       return true; 
      } 
      ModelProductInformation str = obj as ModelProductInformation; 
      if (str.ProductName==null) 
      { 
       return true; 
      } 
      if (str.ProductName.ToUpper().Contains(filterText.ToUpper())) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     }; 
     textEdit.TextChanged += delegate 
     { 
      filterText = textEdit.Text; 
      filteredList.Refresh(); 
     }; 
    } 
} 

XAML:

<dxe:ListBoxEdit x:Name="ProductInfoList" Margin="1.666,1,8,8" Grid.Column="2" Grid.Row="2" Grid.RowSpan="5" DisplayMember="ProductName" DataContext="{Binding ProductInfoView, ElementName=window}" ItemsSource="{Binding}"/> 

我想我的問題是,無論是數據綁定或內部任務()。

回答

0

我會使ObservableCollection是一個私人領域,只是創建一次實例,也只是創建一次ICollectionView。要添加新數據,您可以使用清除並添加到您的收藏 - 嘗試它,它適用於我。

private ObservableCollection<ModelProductInformation> productInfoCollection; 

//ctor, just once in the constructor 
this.productInfoCollection = new ObservableCollection<ModelProductInformation>(); 
this.ProductInfoView = CollectionViewSource.GetDefaultView(productInfoCollection); 
new ProductInfoSearch(ProductInfoView, this.TestTextBox); 


private void RibbonSetupProduct_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    this.hidePanels(); 
    new Task(() => 
    { 
     this.Dispatcher.Invoke(new Action(() => 
     { 
      var yourData = from ProductInfo in new GTS_ERPEntities().ProductInformations select new ModelProductInformation { ProductID = ProductInfo.ProductID, ProductName = ProductInfo.ProductName , Remark=ProductInfo.Remark}; 
      //if you wanna change the collection, simple clear and add(or create AddRange extension) 
      this.productInfoCollection.Clear(); 

      foreach(var data in yourData) 
      { this.productInfoCollection.Add(data);} 
     } 
      ), DispatcherPriority.DataBind); 
    } 
    ).Start(); 

    this.PanelProducts.Visibility = Visibility.Visible; 
} 
+0

我刪除任務的東西,但它仍然不working.Please有任何其他的解決方案。 –

+0

您是否嘗試過一次實例化並將productInfoCollection作爲類成員?我在過去使用ICollection的局部變量時遇到了一些問題,就像您對productInfoCollection使用 – blindmeis

+0

我解決了我的問題。問題出現在列表框中。我使用了Developer Express ListBoxEdit。這不是工作。我不知道爲什麼。現在我使用ListBox並且工作正常,您的答案也是正確的。謝謝。 –