Флажок привязки к общему свойству в пользовательском классе - PullRequest
0 голосов
/ 07 июля 2019

Так что это должно быть просто, я думаю, но я никогда не делал этого.

Получил форму, на которой у меня есть флажок. Я хочу, чтобы этот флажок был напрямую связан с логическим свойством пользовательского класса, но почему-то это не работает.

Public Class someClass
    Private Shared _Filter_Neighbor_6X1 As Boolean = True
    Shared Property Filter_Neighbor_6X1() As Boolean
        Get
            Return _Filter_Neighbor_6X1
        End Get
        Set(ByVal Value As Boolean)
            _Filter_Neighbor_6X1 = Value
        End Set
    End Property
End Class

Public Class GameGUI
    Private Sub GameGUI_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    chk_FilterAll.DataBindings.Add("Checked", someClass, "Filter_Neighbor_6X1")
    end sub
End Class

Выше не работает. Он жалуется, что "someClass" - это класс.

Я тоже пробовал:

chk_FilterAll.DataBindings.Add( _
    New Binding("Checked", someClass, "Filter_Neighbor_6X1", _
                False, DataSourceUpdateMode.OnPropertyChanged, False))

, которая вешает приложение при запуске.

любая помощь приветствуется.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Если вы не хотите избавляться от модификатора Shared, вы можете добавить свойство только для чтения, которое возвращает значение общего:

Public Class someClass
    ' ...
    ' ...

    ' TODO: Remember to use a different name.
    Public ReadOnly Property MyNonSharedProperty As Boolean
        Get
            Return Filter_Neighbor_6X1
        End Get
    End Property   
End Class

Затем вы можете использовать егокак это:

Dim instanceOfSomeClass As New someClass()
chk_FilterAll.DataBindings.Add("Checked", instanceOfSomeClass, "MyNonSharedProperty")

Или с подходом Singleton (подробности см. другой ответ ):

chk_FilterAll.DataBindings.Add("Checked", someClass.Instance, "MyNonSharedProperty")

Однако, обратите внимание, что если вы реализуете интерфейс INotifyPropertyChanged в своем классе *, вам нужно будет уведомить об изменении свойства только для чтения, а также свойства Shared, когда последний получитизменено.

Полная реализация:

Public Class someClass
    Implements INotifyPropertyChanged

    ' ##################################
    ' Optional: Add Singleton logic here
    ' ##################################

    Private _Filter_Neighbor_6X1 As Boolean = True
    Public Property Filter_Neighbor_6X1() As Boolean
        Get
            Return _Filter_Neighbor_6X1
        End Get
        Set(ByVal Value As Boolean)
            _Filter_Neighbor_6X1 = Value
            NotifyPropertyChanged()
            ' TODO: Remember to change the name of the property.
            NotifyPropertyChanged("MyNonSharedProperty")
        End Set
    End Property

    ' TODO: Remember to use a different name.
    Public ReadOnly Property MyNonSharedProperty As Boolean
        Get
            Return Filter_Neighbor_6X1
        End Get
    End Property

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub
End Class

* Что следует делать при использовании класса в качествеисточник DataBinding.

0 голосов
/ 07 июля 2019

Вы не можете привязать к общему свойству. Вам необходимо удалить модификатор Shared из свойства, создать экземпляр класса и использовать этот экземпляр для привязки данных. Ваш класс будет выглядеть примерно так:

Public Class someClass
    Private _Filter_Neighbor_6X1 As Boolean = True
    Public Property Filter_Neighbor_6X1() As Boolean
        Get
            Return _Filter_Neighbor_6X1
        End Get
        Set(ByVal Value As Boolean)
            _Filter_Neighbor_6X1 = Value
        End Set
    End Property
End Class

Тогда вы можете сделать что-то вроде:

Dim instanceOfSomeClass As New someClass()
chk_FilterAll.DataBindings.Add("Checked", instanceOfSomeClass, "Filter_Neighbor_6X1")

Обратите внимание, что если у вас нет дополнительной логики в Get или Set свойства, вы можете избавиться от вспомогательного поля и преобразовать его в свойство Auto-Implemented (сокращение): *

Public Property Filter_Neighbor_6X1 As Boolean = true

Более того, если вы не хотите каждый раз создавать экземпляр класса, вы можете сделать его синглтоном :

Public Class someClass
    Private Shared _instance As someClass

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance As someClass
        Get
            If _instance Is Nothing Then _instance = New someClass()
            Return _instance
        End Get
    End Property

    Public Property Filter_Neighbor_6X1 As Boolean = True
End Class

Затем вы можете использовать его прямо так:

chk_FilterAll.DataBindings.Add("Checked", someClass.Instance, "Filter_Neighbor_6X1")

* Вам, вероятно, do нужна дополнительная логика в этом конкретном случае, чтобы уведомить об изменении свойства, чтобы элемент управления мог отразить это изменение. Проверьте другой ответ для получения дополнительной информации.

...