मॉडल और ViewModel के बीच संभावित संबंध दिखाती हैं मैं पहली बार string
में Occupation
के प्रकार बदल कर अपनी उदाहरण सरलीकृत करने के लिए। तब PersonModel
और PersonViewModel
इस प्रकार दिखाई देंगे:
public class PersonModel : INotifyPropertyChanged
{
private string occupation;
public string Occupation
{
get
{
return this.occupation;
}
set
{
if (this.occupation != value)
{
this.occupation = value;
this.OnPropertyChanged("Occupation");
}
}
}
}
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
public string Occupation
{
get
{
return this.model.Occupation;
}
set
{
this.model.Occupation = value;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
}
private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged(e.PropertyName);
}
}
अपने संस्करण के लिए महत्वपूर्ण अंतर यह है कि PersonModel
और PersonViewModel
दोनों लागू INotifyPropertyChanged
है। यह महत्वपूर्ण है क्योंकि अन्यथा PersonModel
की संपत्ति को सीधे बदलना (यानी PersonViewModel
के माध्यम से बिना) दृश्य में कोई प्रभाव नहीं पड़ेगा। यह भी ध्यान दें कि मॉडल से PropertyChangedEvent
को दृश्य में कैसे पाइप किया गया है।
अब मान लीजिए Occupation
एक string
लेकिन एक अपनी ही है, जैसे के गुणों के साथ श्रेणी नहीं है:
public class OccupationModel : INotifyPropertyChanged
{
private double salary;
public double Salary
{
get
{
return this.salary;
}
set
{
if (this.salary != value)
{
this.salary = value;
this.OnPropertyChanged("Salary");
}
}
}
}
अपने देखें और मॉडल क्या आप देखें करने के लिए अपने डेटा प्रस्तुत कैसे पर कुछ लचीलापन प्रदान करता है के बीच एक ViewModel का उपयोग करना ।
विकल्प 1Occupation
के गुणों का पर्दाफाश PersonViewModel
में सीधे: यहाँ दो विकल्प आप इसे कैसे कर सकता है कर रहे हैं। यह एक आसान समाधान है क्योंकि आपको किसी अन्य व्यूमोडेल को लागू करने की आवश्यकता नहीं है।
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
public double OccupationSalary
{
get
{
return this.model.Occupation.Salary;
}
set
{
this.model.Occupation.Salary = value;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.model.Occupation.PropertyChanged += new PropertyChangedEventHandler(occupation_PropertyChanged);
}
private void occupation_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged("Occupation" + e.PropertyName);
}
}
OccupationSalary
संपत्ति Occupation
में Salary
संपत्ति के लिए सीधी पहुँच देता है। ध्यान दें कि अब Occupation
की घटना को संभालने की आवश्यकता है, और हमें occupation_PropertyChanged
में संपत्ति का नाम बदलना होगा।
विकल्प 2 (अनुशंसित) एक OccupationViewModel
के माध्यम से Occupation
के गुणों बताएं। आपको यह करना चाहिए यदि आपको किसी भी व्यावसायिक तर्क को Occupation
पर लागू करने की आवश्यकता है। आप देख सकते हैं OccupationViewModel
बिल्कुल उसी संरचना सरलीकृत PersonViewModel
जैसा कि मैंने शुरू में पता चला है
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
private OccupationViewModel occupationViewModel;
public OccupationViewModel OccupationViewModel
{
get
{
return this.occupationViewModel;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.occupationViewModel = new OccupationViewModel(this.model.occupation);
}
}
public class OccupationViewModel : INotifyPropertyChanged
{
private OccupationModel model;
public double Salary
{
get
{
return this.model.Salary;
}
set
{
this.model.Salary = value;
}
}
public OccupationViewModel(OccupationModel model)
{
this.model = model;
this.model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
}
private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged(e.PropertyName);
}
}
: अपने उदाहरण को देखते हुए, यह शायद आप क्या करने का इरादा क्या है। OccupationViewModel
के आपके संस्करण में महत्वपूर्ण अंतर यह है कि यह गुणOccupationModel
का खुलासा करता है, OccupationModel
स्वयं नहीं।
PersonViewModel क्यों है। एक लिखने योग्य संपत्ति का निष्पादन? आम तौर पर यह केवल पढ़ने के लिए होगा - आखिरकार, इसे सेट करने वाला कौन है? –
मैं इसे उजागर करने की सोच रहा था ताकि कुछ अन्य दृश्य मॉडल इसे बदल सकें। या यह वह जगह है जहां कुछ विधि या आदेश आते हैं? बीटीडब्ल्यू, मैं एक डब्ल्यूपीएफ, एमवीवीएम नौसिखिया हूँ। – Patrick
पैट्रिक मुझे लगता है कि जो कह रहा है कि व्यू-मॉडल को इसे बिना सेट किए (बाहरी रूप से एक्सेस करके) को संशोधित किया जा सकता है: 'personViewModel.Occupation.Occupation = new OccationModel (" सॉफ़्टवेयर इंजीनियर ");' – Jay