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>
Ключевые слова: :