bd3cdf7ea0
- aggiunto bottone link in MTable - aggiunto sposta con salto in MTable
81 lines
3.5 KiB
VB.net
81 lines
3.5 KiB
VB.net
Imports System.Windows.Controls.Primitives
|
|
Imports System.ComponentModel
|
|
|
|
|
|
Public Class MultiSelectorBehaviours
|
|
|
|
Public Shared ReadOnly SynchronizedSelectedItemsProperty As DependencyProperty = DependencyProperty.RegisterAttached("SynchronizedSelectedItems", GetType(IList), GetType(MultiSelectorBehaviours), New PropertyMetadata(Nothing, AddressOf OnSynchronizedSelectedItemsChanged))
|
|
Public Shared ReadOnly SynchronizationManagerProperty As DependencyProperty = DependencyProperty.RegisterAttached("SynchronizationManager", GetType(SynchronizationManager), GetType(MultiSelectorBehaviours), New PropertyMetadata(Nothing))
|
|
|
|
|
|
Public Shared Function GetSynchronizedSelectedItems(ByVal dependencyObject As DependencyObject) As IList
|
|
Return CType(dependencyObject.GetValue(SynchronizedSelectedItemsProperty), IList)
|
|
End Function
|
|
|
|
Public Shared Sub SetSynchronizedSelectedItems(ByVal dependencyObject As DependencyObject, ByVal value As IList)
|
|
dependencyObject.SetValue(SynchronizedSelectedItemsProperty, value)
|
|
End Sub
|
|
|
|
Private Shared Function GetSynchronizationManager(ByVal dependencyObject As DependencyObject) As SynchronizationManager
|
|
Return CType(dependencyObject.GetValue(SynchronizationManagerProperty), SynchronizationManager)
|
|
End Function
|
|
|
|
Private Shared Sub SetSynchronizationManager(ByVal dependencyObject As DependencyObject, ByVal value As SynchronizationManager)
|
|
dependencyObject.SetValue(SynchronizationManagerProperty, value)
|
|
End Sub
|
|
|
|
Private Shared Sub OnSynchronizedSelectedItemsChanged(ByVal dependencyObject As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
|
|
If e.OldValue IsNot Nothing Then
|
|
Dim synchronizer As SynchronizationManager = GetSynchronizationManager(dependencyObject)
|
|
synchronizer.StopSynchronizing()
|
|
SetSynchronizationManager(dependencyObject, Nothing)
|
|
End If
|
|
|
|
Dim list As IList = TryCast(e.NewValue, IList)
|
|
Dim selector As Selector = TryCast(dependencyObject, Selector)
|
|
|
|
If list IsNot Nothing AndAlso selector IsNot Nothing Then
|
|
Dim synchronizer As SynchronizationManager = GetSynchronizationManager(dependencyObject)
|
|
|
|
If synchronizer Is Nothing Then
|
|
synchronizer = New SynchronizationManager(selector)
|
|
SetSynchronizationManager(dependencyObject, synchronizer)
|
|
End If
|
|
|
|
synchronizer.StartSynchronizingList()
|
|
End If
|
|
End Sub
|
|
|
|
Private Class SynchronizationManager
|
|
Private ReadOnly _multiSelector As Selector
|
|
Private _synchronizer As TwoListSynchronizer
|
|
|
|
Friend Sub New(ByVal selector As Selector)
|
|
_multiSelector = selector
|
|
End Sub
|
|
|
|
Public Sub StartSynchronizingList()
|
|
Dim list As IList = GetSynchronizedSelectedItems(_multiSelector)
|
|
|
|
If list IsNot Nothing Then
|
|
_synchronizer = New TwoListSynchronizer(GetSelectedItemsCollection(_multiSelector), list)
|
|
_synchronizer.StartSynchronizing()
|
|
End If
|
|
End Sub
|
|
|
|
Public Sub StopSynchronizing()
|
|
_synchronizer.StopSynchronizing()
|
|
End Sub
|
|
|
|
Public Shared Function GetSelectedItemsCollection(ByVal selector As Selector) As IList
|
|
If TypeOf selector Is MultiSelector Then
|
|
Return (TryCast(selector, MultiSelector)).SelectedItems
|
|
ElseIf TypeOf selector Is ListBox Then
|
|
Return (TryCast(selector, ListBox)).SelectedItems
|
|
Else
|
|
Throw New InvalidOperationException("Target object has no SelectedItems property to bind.")
|
|
End If
|
|
End Function
|
|
End Class
|
|
End Class
|