2014-06-13 17 views
0

事件我建立基於代碼here過濾器是不是在icollectionview

我已經轉換代碼VB.Net在WPF中filteredComboBox,因爲這是該項目使用。正在使用的代碼有一個調用來在屬性中添加一個處理程序,但它不起作用。我很久沒有做過這種風格的代碼,而且有點迷路。任何想法可能在這裏嘗試解決這個問題?

這是C#

protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue) 
     { 
      if (newValue != null) 
      { 
       ICollectionView view = CollectionViewSource.GetDefaultView(newValue); 
       view.Filter += this.FilterPredicate; 
      } 

      if (oldValue != null) 
      { 
       ICollectionView view = CollectionViewSource.GetDefaultView(oldValue); 
       view.Filter -= this.FilterPredicate; 
      } 

      base.OnItemsSourceChanged(oldValue, newValue); 
     } 

原始分段這是轉換的VB

<summary> 
Keep the filter if the ItemsSource is explicitly changed. 
</summary> 
<param name="oldValue">The previous value of the filter.</param> 
<param name="newValue">The current value of the filter.</param> 

Protected Overrides Sub OnItemsSourceChanged(oldValue As IEnumerable, newValue As IEnumerable) 
    If newValue IsNot Nothing Then 
     'Dim view As ICollectionView = CollectionViewSource.GetDefaultView(newValue) 
     ' AddHandler view.Filter, AddressOf Me.FilterPredicate 

     AddHandler CollectionViewSource.GetDefaultView(newValue).Filter, AddressOf Me.FilterPredicate 
    End If 

    If oldValue IsNot Nothing Then 
     Dim view As ICollectionView = CollectionViewSource.GetDefaultView(oldValue) 
     RemoveHandler view.Filter, AddressOf Me.FilterPredicate 
    End If 

    MyBase.OnItemsSourceChanged(oldValue, newValue) 
End Sub 

錯誤是「過濾器不是 'System.ComponentModel.ICollectionView' 的事件。

+0

這不是一個事件,這是一個性質。問題的哪一部分與c#有關? –

+0

我知道這是一個屬性,我正在重新使用示例代碼,它的目標是工作,並且最初是用c#編寫的(請參閱它的完整代碼的鏈接) –

+1

轉換錯誤的代碼不會產生良好的代碼。如果你知道這是一個屬性,然後按照它的意圖使用它。 – OneFineDay

回答

1

由於filter是ICollectionView中的一個屬性,因此您可能不會像原始CollectionView那樣附加事件,因此您可以直接指向謂詞方法

例如。通過LINQ

view.Filter = Function(item) CType(item, YourClass).Check 

樣品的情況下

Protected Overrides Sub OnItemsSourceChanged(oldValue As IEnumerable, newValue As IEnumerable) 
    If newValue IsNot Nothing Then 
     Dim view As ICollectionView = CollectionViewSource.GetDefaultView(newValue) 

     'assign predicate method 
     view.Filter= AddressOf Me.FilterPredicate 
    End If 

    If oldValue IsNot Nothing Then 
     Dim view As ICollectionView = CollectionViewSource.GetDefaultView(oldValue) 

     'unassign predicate 
     view.Filter = Nothing 
    End If 

    MyBase.OnItemsSourceChanged(oldValue, newValue) 
End Sub