वीबीएनईटी में (तृतीय पक्ष पुस्तकालयों को संदर्भित किए बिना), मुझे पता चल रहा है कि मैं निम्नलिखित में से बहुत से कोड लिख रहा हूं:

Private _prop as String = "test"
Public Property Prop As String
  Get
    Return _prop
  End Get
  Set(value As String)
    _prop = value
    NotifyPropertyChanged()
  End Set

'(add more properties here...)

Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Protected Overridable Sub NotifyPropertyChanged(<CallerMemberName> Optional propertyName As String = "")
    If PropertyChangedEvent IsNot Nothing Then
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End If
End Sub

मैं जो करने में सक्षम होना चाहता हूं वह कुछ ऐसा है:

Public ObservableProperty Prop As String = "test"

और ObservableProperty एक ऐसा निर्माण है जिसे मैं परिभाषित करता हूं जो सभी बॉयलरप्लेट सामान करता है।

मुझे पता है कि अगर मैं नहीं चाहता कि यह अवलोकन योग्य हो, तो मैं उसी पैटर्न (Public Property NonObsProp As String = "test") का उपयोग कर सकता था, तो क्या उन्हें स्वचालित रूप से भी देखने योग्य बनाना संभव है?

0
simonalexander2005 27 जुलाई 2016, 18:34

2 जवाब

सबसे बढ़िया उत्तर

नॉकआउट.जेएस से प्रेरित आईएनपीसी प्रॉपर्टी बॉयलरप्लेट को कम करने का एक संभावित तरीका एक अवलोकन योग्य मूल्य प्रकार को परिभाषित करना होगा।

Imports System.ComponentModel

Public Class ObservableValue(Of T)
    Implements INotifyPropertyChanging, INotifyPropertyChanged

    Public Event PropertyChanging As PropertyChangingEventHandler Implements INotifyPropertyChanging.PropertyChanging
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private Shared ReadOnly __changing As PropertyChangingEventArgs = New PropertyChangingEventArgs("Value")
    Private Shared ReadOnly __changed As PropertyChangedEventArgs = New PropertyChangedEventArgs("Value")

    Public Sub New()
    End Sub

    Public Sub New(initialValue As T)
        _value = initialValue
    End Sub

    Private _value As T
    Public Property Value As T
        Get
            Return _value
        End Get
        Set(newValue As T)
            If Not EqualityComparer(Of T).Default.Equals(_value, newValue) Then
                RaiseValueChanging()
                _value = newValue
                RaiseValueChanged()
            End If
        End Set
    End Property

    Public Sub RaiseValueChanging()
        RaiseEvent PropertyChanging(Me, __changing)
    End Sub

    Public Sub RaiseValueChanged()
        RaiseEvent PropertyChanged(Me, __changed)
    End Sub

    Public Overrides Function ToString() As String
        Return If(_value IsNot Nothing, _value.ToString(), String.Empty)
    End Function

    Public Shared Widening Operator CType(value As T) As ObservableValue(Of T)
        Return New ObservableValue(Of T)(value)
    End Operator

End Class

इसके बाद गुणों को परिभाषित करने के लिए इसका उपयोग किया जा सकता है - कक्षा को INotifyPropertyChanged को लागू करने की आवश्यकता नहीं है, जब तक कि किसी अन्य कारण से इसकी आवश्यकता न हो।

Public Class MyViewModel
    Public ReadOnly Property Prop1 As ObservableValue(Of String) = "A"
    Public ReadOnly Property Prop2 As ObservableValue(Of Boolean) = False
End Class

फिर आपको मूल्य प्राप्त/सेट करते समय .Value संपत्ति तक पहुंचने के लिए याद रखना होगा (ReadOnly मदद करता है, और शायद अंतर्निहित मूल्य का पर्दाफाश करने का एक और शानदार तरीका है), उदा। डब्ल्यूपीएफ बाइंडिंग में:

vm.Prop1.Value = "NewValue"
<TextBlock Text="{Binding Prop1.Value}"/>

मैंने अभी तक इस पैटर्न का उपयोग डाउनसाइड्स की खोज के लिए पर्याप्त नहीं किया है... या यहां तक ​​कि अपसाइड बनाम विशिष्ट आईएनपीसी पैटर्न।

1
Mark 27 जुलाई 2016, 20:35