Рейтинг@Mail.ru

WPF: элементы ListBox в виде CheckBox

Print Friendly, PDF & Email

Как в 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>
Теги :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email