वीबीएनईटी में (तृतीय पक्ष पुस्तकालयों को संदर्भित किए बिना), मुझे पता चल रहा है कि मैं निम्नलिखित में से बहुत से कोड लिख रहा हूं:
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"
) का उपयोग कर सकता था, तो क्या उन्हें स्वचालित रूप से भी देखने योग्य बनाना संभव है?
2 जवाब
@Sstan की एक टिप्पणी ने मुझे सही दिशा में इंगित किया। यह एक सही उत्तर नहीं है, लेकिन यह सबसे नज़दीक है जो मैं अभी प्राप्त करने जा रहा हूं।
अनिवार्य रूप से, यह यहांए> का तरीका है। a>, जो एक SetProperty
विधि बनाने का सुझाव देता है जो NotifyPropertyChanged
को कॉल करता है, बॉयलरप्लेट कोड को कम करता है।
कुछ इस तरह:
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
नॉकआउट.जेएस से प्रेरित आईएनपीसी प्रॉपर्टी बॉयलरप्लेट को कम करने का एक संभावित तरीका एक अवलोकन योग्य मूल्य प्रकार को परिभाषित करना होगा।
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}"/>
मैंने अभी तक इस पैटर्न का उपयोग डाउनसाइड्स की खोज के लिए पर्याप्त नहीं किया है... या यहां तक कि अपसाइड बनाम विशिष्ट आईएनपीसी पैटर्न।
संबंधित सवाल
नए सवाल
.net
.NET कोर के बारे में प्रश्नों के लिए उपयोग न करें - इसके बजाय [.net-core] का उपयोग करें। .NET फ्रेमवर्क मुख्य रूप से माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम के लिए डिज़ाइन किया गया एक सॉफ्टवेयर फ्रेमवर्क है। इसमें बेस क्लास लाइब्रेरी, कॉमन लैंग्वेज रनटाइम (आमतौर पर सीएलआर के रूप में संदर्भित), कॉमन टाइप सिस्टम (आमतौर पर सीटीएस के रूप में संदर्भित) और डायनेमिक भाषा रनटाइम का कार्यान्वयन शामिल है। यह C #, VB.NET, F # और C ++ / CLI सहित कई प्रोग्रामिंग भाषाओं का समर्थन करता है।