2013-06-04 9 views
8

में अन्य व्यूमोडल्स में प्रॉपर्टी एक्सेस करना मेरे पास मुख्य ViewModel है जिसमें मैं UserControls की एक निश्चित राशि में उपयोग कर रहा हूं, जो मुख्य दृश्य पर ContentControl में प्रदर्शित होते हैं। ViewModels के बीच डेटा का आदान-प्रदान करने का मेरा वर्तमान तरीका मुख्य ViewModel में ViewModels में से प्रत्येक का संदर्भ बनाने के लिए मौजूद है, और प्रत्येक UserControl में मुख्य ViewModel में से एक का संदर्भ है। हालांकि मुझे नहीं पता कि यह करने का यह सही तरीका है, क्योंकि मेरे पास ViewModelLocator है और मुझे उम्मीद है कि इस वर्ग में कुछ ऐसा करने के लिए कुछ कार्यक्षमता होगी।एमवीवीएम लाइट

क्या कोई मुझे बता सकता है कि मैं यह ठीक कर रहा हूं, या यदि एमवीवीएम लाइट में ऐसा करने का बेहतर तरीका है?

संपादित करें:

मैं इस पाया जब मैं कुछ अलग के लिए खोज रहा था, यह एक बेहतर समाधान हो सकता है?

private ViewModelLocator locator = new ViewModelLocator(); 

और फिर प्रत्येक व्यूमोडेल को संदर्भित करने के लिए लोकेटर गुणों का उपयोग करना?

EDIT2:

मैं जाहिरा तौर पर क्या काम करेगा नहीं, पहली बार में मैं केवल संदर्भ मुख्य ViewModel में था करता है सोचा है और इस काम किया, लेकिन जब मैं UserControls में यह कोशिश यह एक तरह से मेरी अनुप्रयोग क्रैश हो। मैं वर्तमान में पहले संपादन के संभावित समाधान की कोशिश कर रहा हूं।

MainViewModel.cs (दूसरों के केवल मुख्य ViewModel के संदर्भ में, इसी तरह के हैं)

public class MainViewModel : ViewModelBase 
{ 
    private ItemAddViewModel itemAddViewModel; 
    private ItemsViewModel itemsViewModel; 

    /// <summary> 
    /// Initializes a new instance of the MainViewModel class. 
    /// </summary> 
    public MainViewModel() 
    { 
     ItemsList = Item.GetItemsList(); 

     itemAddViewModel = ServiceLocator.Current.GetInstance<ItemAddViewModel>(); 
     itemsViewModel = ServiceLocator.Current.GetInstance<ItemsViewModel>(); 

     ShowItemsView(); 
    } 
... 
    private void ShowItemsView() 
    { 
     CurrentControl = itemsViewModel; 
    } 
... 

उत्तर

17

आप वास्तव में ViewModelLocator उपयोग कर सकते हैं। डिफॉल्ट रूप से कंट्रोल कंटेनर के इनवर्जन का उपयोग करता है, इसलिए यदि आप लोकेटर का नया उदाहरण बनाते हैं, तो आपको कंटेनर से सिंगलटन व्यूमोडल्स का एक ही उदाहरण मिल जाएगा।

लोकेटर वर्ग:

static ViewModelLocator() 
{ 
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
    SimpleIoc.Default.Register<ViewModel1>(); 
    SimpleIoc.Default.Register<ViewModel2>(); 
    SimpleIoc.Default.Register<ViewModel3>(); 
} 

public ViewModel1 ViewModel1 
{ 
    get 
    { 
     return ServiceLocator.Current.GetInstance<ViewModel1>(); 
    } 
} 

public ViewModel2 ViewModel2 
{ 
    get 
    { 
     return ServiceLocator.Current.GetInstance<ViewModel2>(); 
    } 
} 

public ViewModel3 ViewModel3 
{ 
    get 
    { 
     return ServiceLocator.Current.GetInstance<ViewModel3>(); 
    } 
} 

तो कोड से आप इसे के रूप में

var vm1 = (new ViewModelLocator()).ViewModel1; 

आप एक और viewmodel का ही उदाहरण मिल उपयोग कर सकते हैं।

XAML से

: संसाधन

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 

और दृश्य (या तो उपयोगकर्ता नियंत्रण या विंडोज़ या जो कुछ भी)

<UserControl 
    ... 
    DataContext="{Binding ViewModel1, Source={StaticResource Locator}}" 
    ... > 
+0

हाँ आप सही हैं, मैंने अभी इसका परीक्षण किया है और यह काम करता है, जैसा कि विस्तृत समाधान के लिए धन्यवाद, इसकी बहुत सराहना की गई है! :) – Kryptoxx

+0

मुझे खुशी है कि यह मदद की :)। और आप निश्चित रूप से अधिक परिष्कृत आईओसी कंटेनर का उपयोग कर सकते हैं, जो आपको सिंगलटन व्यूमोडल्स और कन्स्ट्रक्टर निर्भरता इंजेक्शन की तुलना में अधिक युक्तियां करने देता है। सरल आईओसी बस सरल है ... – eMko

1

सब तो के लिए DataContext (defaultly App.xaml में Application.Resources में है) सामग्री नियंत्रण के अंदर, आपको मुख्य व्यूमोडेल से एक संपत्ति को बांधना है, बस इस वाक्यविन्यास का उपयोग करें:

... Binding="{DataContext.mainvmpropertyname, ElementName=xxxx}" 

जहां xxxx सामग्री नियंत्रण से जुड़ा नाम है (या कोई भी नियंत्रण जिसमें मुख्य व्यूमोडेल डेटाकॉन्टेक्स्ट के रूप में है)। वैकल्पिक रूप से, आप तत्व नाम के बजाय सापेक्ष बाध्यकारी का उपयोग कर सकते हैं।

1

आप प्रोग्राम के ऐप्स संसाधनों से लोकेटर हो रही द्वारा ViewModel लोकेटर के सार्वजनिक गुण पहुंच सकता है:

MyViewModel vm = (App.Current.Resources["Locator"] as ViewModelLocator).MyViewModel 

या ViewModelLocator कक्षा में एक और स्थिर उदाहरण बनाकर:

public class ViewModelLocator 
{ 
    public static ViewModelLocator Instance = new ViewModelLocator(); 

    static ViewModelLocator(){ ... } 

    public MainViewModel Main 
    { 
    ... 
    } 
} 

Similar Thread

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