2013-03-13 10 views
8

मैं एक दिलचस्प मुद्दा है जिसके लिए मैं अभी तक कोई स्पष्टीकरण मिल गया है भर में आया है ...ViewModel सदस्यों की दृश्यता क्या होनी चाहिए?

बहुत सरल MVVM WPF नीचे आवेदन को देखते हुए, क्यों केवल तभी कॉम्बो बॉक्स के लिए बाध्य सूची है में उसकी दृश्यता ViewModel public पर सेट है?

internal पर दृश्यता को संकलित समय पर कोई त्रुटि या चेतावनी नहीं उठाती है लेकिन रन टाइम पर कॉम्बो बॉक्स खाली छोड़ देता है।

the official documentation उद्धरण internal प्रकार या सदस्य केवल उसी असेंबली में फ़ाइलों के भीतर पहुंच योग्य हैं।

और यह समस्या इस तथ्य के बावजूद हो रही है कि व्यू और व्यूमोडेल को एक ही असेंबली में परिभाषित किया गया है।

यहाँ कैसे कोड लग रहा है जैसे:

मॉडल:

class TestModel 
{ 
    internal List<string> Musketeers { get; private set; } 

    public TestModel() 
    { 
     Musketeers = new List<string> { "Athos", "Porthos", "Aramis" }; 
    } 
} 

दृश्य:

<Window x:Class="TestWpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Width="250" Height="25" ItemsSource="{Binding TestList}" /> 
    </Grid> 
</Window> 

ViewModel:

class TestViewModel : INotifyPropertyChanged 
{ 
    TestModel myModel = new TestModel(); 

    public List<string> TestList 
    { 
     get 
     { 
      return myModel.Musketeers; 
     } 
    } 

    // INotifyPropertyChanged members are below ... 
} 
+0

_ उसी विधानसभा में दृश्य और दृश्य मॉडल नहीं है? _ मैं इसका उत्तर नहीं दे सकता। आपने उन्हें कहां परिभाषित किया है? –

+0

@ChrisDunaway ओह, तुम सही हो! मैंने अब अपना शब्द तय कर दिया है ... –

उत्तर

7

internal उपयोग के साथ ViewModelView के लिए दिख रहा है, लेकिन Binding वर्ग, जो वास्तव में बंधन काम करता है को दिखाई नहीं देता।

{Binding TestList}Binding वर्ग उदाहरण है, जो आपके ViewModel वर्ग के internal सदस्यों के बारे में कोई ज्ञान नहीं है के रूप में तब्दील किया गया है।

+0

ऐसा नहीं है कि मैं ऐसा करने की अनुशंसा करता हूं, लेकिन अब मैं सोच रहा हूं कि क्या आप 'आंतरिक' का उपयोग करने से दूर हो सकते हैं यदि आपकी असेंबली में 'प्रेजेंटेशन कोर' का 'आंतरिक दृश्यमान' भी था असेंबली ... – JerKimball

+0

शायद यह इस तरह से किया जा सकता है, लेकिन ऐसी चीज करने का क्या मतलब है? – MarcinJuraszek

+0

बिल्कुल कोई कारण नहीं :) - मुझे यह जानने की तरह है कि किसी भी स्थिति में * संभव * क्या है। – JerKimball

6

ऐसा इसलिए है क्योंकि डेटा बाध्यकारी प्रतिबिंब का उपयोग करता है और बदले में आइटम की दृश्यता के लिए पालन करता है। चूंकि डेटा बाध्यकारी आपकी असेंबली के बाहर लागू की गई है - डब्ल्यूपीएफ पुस्तकालयों के अंदर - यह गैर-सार्वजनिक सदस्यों को नहीं देख सकता है।

एक गैर-मौजूदा सदस्य के लिए बाध्यकारी रनटाइम त्रुटि जारी नहीं करेगा बल्कि लापता सदस्य के बारे में विवरण वाले संदेश के साथ एक डीबग आउटपुट जारी नहीं करेगा।

+0

उत्तर के लिए धन्यवाद! बहुत बुरा जवाब कई उत्तरों को स्वीकार करना संभव नहीं है ... –

संबंधित मुद्दे