2011-03-15 3 views
3

IList를 확장하여 목록의 변경 사항 (업데이트, 삽입 및 삭제)을 추적 할 수 있습니다.
모든 것이 정상이지만 어떤 ItemsControl도 바인딩 할 수 없습니다.WPF : 확장 IList (T)를 바인딩 가능하게 만들기 위해 구현해야하는 것은 무엇입니까?

Public Class TrackedList(Of T) 
    Implements IList(Of T), INotifyCollectionChanged 

    Public Sub New(Lista As IList(Of T)) 
     m_inner = Lista 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)) 
    End Sub 

    Private m_inner As IList(Of T) 
    Public ReadOnly Property Inner() As IList(Of T) 
     Get 
      If m_inner Is Nothing Then 
       m_inner = New List(Of T)() 
      End If 
      Return m_inner 
     End Get 
    End Property 

    Private m_Updates As IList(Of T) 
    Public ReadOnly Property Updates() As IList(Of T) 
     Get 
      If m_Updates Is Nothing Then 
       m_Updates = New List(Of T)() 
      End If 
      Return m_Updates 
     End Get 
    End Property 

    Private m_Inserts As IList(Of T) 
    Public ReadOnly Property Inserts() As IList(Of T) 
     Get 
      If m_Inserts Is Nothing Then 
       m_Inserts = New List(Of T)() 
      End If 
      Return m_Inserts 
     End Get 
    End Property 

    Private m_Deletes As IList(Of T) 
    Public ReadOnly Property Deletes() As IList(Of T) 
     Get 
      If m_Deletes Is Nothing Then 
       m_Deletes = New List(Of T)() 
      End If 
      Return m_Deletes 
     End Get 
    End Property 

    'Propietary methods' 
    Public Sub ItemUpdated(ByVal item As T) 
     If Not Updates.Contains(item) Then Updates.Add(item) 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace)) 
    End Sub 

    Public Sub FlushChanges() 
     m_Updates = Nothing 
     m_Inserts = Nothing 
     m_Updates = Nothing 
    End Sub 


    Public Sub Add(ByVal item As T) Implements System.Collections.Generic.ICollection(Of T).Add 
     Inner.Add(item) 
     Inserts.Add(item) 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add)) 
    End Sub 

    Public Sub Clear() Implements System.Collections.Generic.ICollection(Of T).Clear 
     If m_inner IsNot Nothing Then 
      Inner.Clear() 
     End If 
    End Sub 

    Public Function Contains(ByVal item As T) As Boolean Implements System.Collections.Generic.ICollection(Of T).Contains 
     Return Inner.Contains(item) 
    End Function 

    Public Sub CopyTo(ByVal array() As T, ByVal arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of T).CopyTo 
     Inner.CopyTo(array, arrayIndex) 
    End Sub 

    Public ReadOnly Property Count() As Integer Implements System.Collections.Generic.ICollection(Of T).Count 
     Get 
      Return Inner.Count 
     End Get 
    End Property 

    Public ReadOnly Property IsReadOnly() As Boolean Implements System.Collections.Generic.ICollection(Of T).IsReadOnly 
     Get 
      Return Inner.IsReadOnly 
     End Get 
    End Property 

    Public Function Remove(ByVal item As T) As Boolean Implements System.Collections.Generic.ICollection(Of T).Remove 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove)) 
     Deletes.Add(item) 
     Return Inner.Remove(item) 

    End Function 


    Public Function IndexOf(ByVal item As T) As Integer Implements System.Collections.Generic.IList(Of T).IndexOf 
     Return Inner.IndexOf(item) 
    End Function 

    Public Sub Insert(ByVal index As Integer, ByVal item As T) Implements System.Collections.Generic.IList(Of T).Insert 
     Inserts.Add(item) 
     Inner.Insert(index, item) 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add)) 
    End Sub 

    Default Public Property Item(ByVal index As Integer) As T Implements System.Collections.Generic.IList(Of T).Item 
     Get 
      Return Inner(index) 
     End Get 
     Set(ByVal value As T) 
      Inner(index) = value 
     End Set 
    End Property 

    Public Sub RemoveAt(ByVal index As Integer) Implements System.Collections.Generic.IList(Of T).RemoveAt 
     Deletes.Add(Inner(index)) 
     Inner.RemoveAt(index) 
     RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove)) 
    End Sub 

    Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator 
     Return Inner.GetEnumerator() 
    End Function 

    Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator 
     Return DirectCast(Inner, IEnumerable).GetEnumerator() 
    End Function 


    Public Event CollectionChanged(sender As Object, e As System.Collections.Specialized.NotifyCollectionChangedEventArgs) Implements System.Collections.Specialized.INotifyCollectionChanged.CollectionChanged 

End Class 

목록을 만들려면 무엇을해야합니까?

+0

ObservableCollection을 사용할 수없는 이유는 무엇입니까? – RQDQ

+0

I 초 @RQDQ. ObservableColleciton (of T)은 좋은 해결책입니다. – Lav

+0

당신은 당신이 가지고있는 문제에 대해 좀 더 구체적으로 설명 할 수 있습니까? ListControl이라는 WPF 형식이 없으며 "바인딩 할 수 없습니다"는 거의 모든 것을 의미 할 수 있습니다. –

답변

0

문제는 수업 시간에, 심지어는 것을 밝혀 문제는 바인딩

Public Shared ReadOnly ItemsProperty As DependencyProperty = _ 
    DependencyProperty.Register("Items", GetType(IList), GetType(MainWindowViewModel)) 

Public Property Items As IList 
    Set(ByVal value As IList) 
     SetValue(ItemsProperty, value) 
    End Set 
    Get 
     Return DirectCast(GetValue(ItemsProperty), IList) 
    End Get 
End Property 

을 해소하기위한 DependencyProperty을 가진 중간 제어에 INotifyCollectionChanged

했다 구현할 필요가 없습니다되지 않았습니다 종속성 속성을 IEnumerable으로 변경하면 문제가 해결됩니다.

4

ObservableCollection에서 상속받을 수 없다면 INotifyCollectionChanged을 구현하고 싶을 것입니다.

+0

그렇지 않습니다. 나는 통보하고 싶지 않다. 나는 변화를 저장해야한다. –

+0

@Eduardo Molteni - 문제는 "그렇지만 ItemsControl을 바인딩 할 수는 없습니다." 어떤 아이템이 변경/삽입/삭제되었는지 계속 추적하고 싶다고 말하고 있습니까? – RQDQ

+0

긴 이야기지만, 나는 오직 확장 된 Ilist Bindable 만 만들고 싶다. –