WPF: элементы ListBox в виде CheckBox
Как в WPF привязать коллекцию типа Boolean к графическому элементу ListBox или ListView с дочерними элементами типа CheckBox?
Напрямую это сделать нельзя. Но можно написать специальный класс-обёртку над коллекцией типа Boolean. Назовём этот класс Wrapper, и пусть он будет обобщённым (generic), чтобы можно было его использовать и с другими простыми типами:
Imports System.ComponentModel
''' <summary>
''' Оболочка для простого типа T.
''' </summary>
Public Class Wrapper(Of T)
Implements INotifyPropertyChanged
Public Property Value As T
Get
Return _Value
End Get
Set(value As T)
_Value = value
OnPropertyChanged(NameOf(Me.Value))
End Set
End Property
Private _Value As T
Public Shared Widening Operator CType(value As T) As Wrapper(Of T)
Return New Wrapper(Of T) With {.Value = value}
End Operator
Public Shared Widening Operator CType(wrapper As Wrapper(Of T)) As T
Return wrapper.Value
End Operator
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Protected Overridable Sub OnPropertyChanged(propName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
End Sub
End Class
Прежде чем использовать этот класс в WPF, в модели необходимо объявить свойство типа Wrapper:
Public Property MyCollection As New List(Of Wrapper(Of Boolean))
Теперь мы можем использовать объект MyCollection в WPF:
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemTemplate>
<ItemContainerTemplate>
<CheckBox IsChecked="{Binding Value}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
</ItemContainerTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ключевые слова: :
