2011-09-14 9 views
5

कैलिबर्न के साथ। मिक्रो मैं व्यूमोडेल की एक संपत्ति के रूप में एक ईएफ 4 इकाई को उजागर करने के पेशेवरों और विपक्ष को जानना चाहता हूं (एक तकनीक hereand here पर चर्चा की गई)। यह मुझे हर क्षेत्र के लिए गेटर्स और सेटर्स लिखने से बचने की अनुमति देता है (नीचे OneCustomer देखें)। दोष मुझे XAML में सभी बाध्यकारी बयान लिखने की आवश्यकता है (नीचे अंतिम नाम ViewModel में नहीं है लेकिन XAML बाध्यकारी की आवश्यकता है)। यदि मैं प्रत्येक व्यू (नीचे दिए गए फर्स्टनाम के रूप में) के साथ मेरे व्यूमोडेल को भरने की निर्धारित तकनीक से चिपक जाता हूं तो मुझे अंततः अतिरिक्त कोड का एक टन लिखना होगा, इसलिए NotifyOfProperyChange को कॉल किया जाएगा। आवेदन काफी बड़ा होगा। क्या मुझे प्रत्येक इकाई को ViewModel की संपत्ति के रूप में बेनकाब करना चाहिए?कैलिबर के साथ बाध्यकारी ईएफ 4। माइक्रो: क्या मुझे अपनी इकाई को व्यूमोडेल की संपत्ति के रूप में उजागर करना चाहिए?

मेरे ViewModel में:

private MyEntities _context = new MyEntities(); 
private BindableCollection<Customer> _custBindableCollection; 
private Customer _oneCustomer; 
private string _firstName; 

public void Load() 
{ 
    _custBindableCollection = new BindableCollection<Customer>(_context.Customers.Where(row => row.CustomerType == "FOO")); 
    AllCustomers = _custBindableCollection; 
    _oneCustomer = _custBindableCollection.FirstOrDefault(); 
    FirstName = _oneCustomer.FirstName; 
    OneCustomer = _oneCustomer; 
} 

public BindableCollection<Customer> AllCustomers 
{ 
get { return _custBindableCollection;} 
set {_custBindableCollection = value; 
     NotifyOfPropertyChange(() => AllCustomers);} 
} 

public Customer OneCustomer 
{ 
get { return _oneCustomer;} 
set { _oneCustomer = value; 
     NotifyOfPropertyChange(() => OneCustomer);} 
} 

public string FirstName 
{ 
    get { return _firstName; } 
    set { 
     _firstName = value; 
     _oneCustomer.FirstName = value; 
     NotifyOfPropertyChange(() => FirstName); 
     NotifyOfPropertyChange(() => CanSaveChanges); 
    } 
} 

public void SaveChanges() 
{ _context.SaveChanges(); } 

public bool CanSaveChanges { get { return IsValid; } } 

मेरे विचार में:

<StackPanel> 
<StackPanel Orientation="Horizontal"> 
    <Label Content="First Name:" /> 
    <TextBox x:Name="FirstName" /> 
</StackPanel> 
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=OneCustomer}"> 
    <Label Content="Last Name:" /> 
    <TextBox x:Name="LastName" Text="{Binding LastName}" /> 
</StackPanel> 
<Button Content="Load Data" x:Name="Load" /> 
<Button Content="Save" x:Name="SaveChanges" /> 
<DataGrid x:Name="AllCustomers" /> 

अग्रिम धन्यवाद।

उत्तर

5

Caliburn.Micro के साथ मैं पेशेवरों और एक EF4 इकाई ViewModel (एक तकनीक यहाँ पर चर्चा की और यहाँ) की एक संपत्ति के रूप में उजागर की विपक्ष जानना चाहते हैं।

मुझे पेशेवरों/विपक्षों के बारे में निश्चित नहीं है लेकिन मैं आपको बता सकता हूं कि दोनों विधियों का उपयोग किया जाता है। उदाहरण के लिए एक साधारण लॉगिन स्क्रीन लें, आम तौर पर मैंने UserName को ViewModel पर एक प्रॉपर्टी डाल दी है, लेकिन ऐसे मामलों में जहां फॉर्म अधिक जटिल है, व्यूमोडेल एक ही चीज़ को पूरा करने के लिए अन्य व्यूमोडेल (डिस्प्ले मॉडल) को जोड़ सकता है। मुख्यमंत्री एमवीवीएम के साथ अधिक सवाल के रूप में पेशेवरों/विपक्ष को अधिक प्रभावित नहीं करते हैं, पेशेवर/विपक्ष क्या हैं। मुख्यमंत्री दोनों को बाध्य करने में आपकी मदद करने जा रहा है।

  • आप ViewModel पर एक संपत्ति CUSTOMERNAME कहा जाता है, तो बस नाम किसी पाठ बॉक्स x: नाम = "CUSTOMERNAME"।
  • आप ViewModel पर एक संपत्ति एक वर्ग बुलाया ग्राहक का एक उदाहरण है कि है, तो नाम पाठ बॉक्स x: नाम = "ग्राहक का" और फिर, मुख्यमंत्री बाइंडिंग को संभाल लेंगे।

    <TextBox x:Name="LastName" Text="{Binding LastName}" /> 
    

    आप StackPanel पर DataContext निर्धारित करने की आवश्यकता नहीं है:

ऊपर अपने XAML से

तो।इसके बजाय:

<TextBox x:Name="OneCustomer_LastName"/> 

एक बात है कि DataForms और datagrids के लिए बाध्यकारी आसान एक तरीका है जहाँ आप जिस तरह से डेटा स्क्रीन पर प्रस्तुत किया जाता है के लिए प्रदर्शन मॉडल बनाने पीछा कर रहा है कर सकते हैं।

यह मेरी राय है लेकिन मैं व्यक्तिगत रूप से कभी ईएफ/लिंक इकाई से सीधे बंधे नहीं रहूंगा। इसके बजाय मैं उस इकाई का प्रतिनिधित्व करने के लिए एक प्रदर्शन मॉडल तैयार करूंगा और मैं इसे कैसे प्रदर्शित करना चाहता हूं और मैपिंग करने के लिए AutoMapper का उपयोग करें। कई मामलों में यह एक मैपिंग में से एक है। यह समय की बर्बादी की तरह प्रतीत हो सकता है लेकिन इसमें विशेष रूप से अधिक जटिल डेटा मॉडल लेआउट के साथ फायदे हैं, डिस्प्ले मॉडल आपको प्रदर्शन उद्देश्यों के लिए डेटा को फ़्लैट करने और डेटा मॉडल इकाई पर चिपके हुए सत्यापन के लिए गुणों को गुणित करने की अनुमति देते हैं। उस पर अधिक जानकारी के लिए ASP.NET MVC in Action पुस्तक में अध्याय देखें।

+0

यह बहुत अच्छी जानकारी है। विशेष रूप से सीएम सम्मेलन को अंडरस्कोर को डॉट नोटेशन के रूप में व्याख्या करने का। मैं निश्चित रूप से ऑटोमैपर और एमवीसी पुस्तक की जांच करूँगा। एक छोटा सवाल हालांकि ... क्या इकाई गुणों को सेटर्स (मूल्य में) में अपडेट किया जाना चाहिए, या मुझे तब तक इंतजार करना चाहिए जब तक कि सेव क्लिक नहीं किया जाता है और सभी को एक बार अपडेट किया जाता है? एक बार फिर धन्यवाद। – DeveloperDan

+0

क्या आप डेटाबेस से बने रहने के लिए कह रहे हैं, जब गुणों को बदलते हुए उपयोगकर्ता मूल्य बदलते हैं। –

+0

नहीं, मैं बचने के लिए जारी रहूंगा (चंकी नहीं चैट नियम)। मैं क्या सोच रहा था कि अगर मैं इकाई का पर्दाफाश नहीं करता हूं, तो मैं सभी इकाई गुणों को अद्यतन करने के लिए सहेजें तक प्रतीक्षा कर सकता हूं। लेकिन अब जब मैं इसके बारे में सोचता हूं जो समझ में नहीं आता है क्योंकि मुझे केवल सभी मूल्यों को अपडेट करना होगा, भले ही केवल एक ही बदला गया हो। इसलिए, मैंने अपने स्वयं के प्रश्न का उत्तर दिया है - मैं सेटर्स में इकाई संपत्ति/फ़ील्ड अपडेट रखूंगा। – DeveloperDan

3

चूंकि संस्थाओं को उजागर करने के अन्य फायदे हैं (उदाहरण के लिए, विशेषताओं के माध्यम से सत्यापन), मैं व्यक्तिगत रूप से उन्हें सीधे प्रकट करता हूं।

लेकिन मुझे लगता है कि उचित उत्तर "यह निर्भर करता है" क्योंकि हमेशा कुछ कमियां होती हैं (मुख्य रूप से वास्तुशिल्प)।

बीटीडब्लू: आप टेक्स्टबॉक्स "वनकैस्टर_लास्टनाम" और सीएम के सम्मेलन बाध्यकारी को कॉल कर सकते हैं।

+0

मेरी इच्छा है कि मैं दो उत्तरों स्वीकार कर सकता हूं। आपकी सहायता के लिए धन्यवाद. – DeveloperDan