2009-09-25 17 views
5

साथ इंजेक्शन देखें मैं एक कंटेनर का मानना ​​है कि इसDataTemplate चालित MVVM

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:AViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:BViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:CViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:DViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </Grid> 
</UserControl> 

तरह दिखता है मेरे सभी ViewModels वारिस BaseViewModel तो मैं इस

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:BaseViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </StackPanel> 
</UserControl> 

में मेरे विचार बदल गया सोच यह दृष्टांत हैं केवल एक ही MyView और ListBox.SelectedItem परिवर्तनों के दौरान व्यूमोडेल को बस दोबारा दोहराएं। क्या मैं इस व्यवहार को सही ढंग से समझ रहा हूं? क्या यह एक पसंदीदा अभ्यास है? मैं कैसे सत्यापित कर सकता हूं कि मैं स्मृति को मंथन नहीं कर रहा हूं क्योंकि मैं विचारों के बीच स्विच करता हूं?

उत्तर

1

यह आपके द्वारा उपयोग किए जाने वाले प्रत्येक दृश्य मॉडल के लिए एक नया MyView चालू करेगा। यदि आप अपने उपयोगकर्ता नियंत्रणों का पुन: उपयोग करना चाहते हैं, तो आप प्रत्येक उपयोगकर्ता नियंत्रण पर DataContext प्रॉपर्टी सेट कर सकते हैं।

2

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

इस समस्या में कभी-कभी हमारे पास ऐसे विचार होंगे जो कोड के पीछे कोड (गैर-कमजोर घटनाओं) में कुछ घटनाओं के लिए पंजीकृत होते हैं और यह दृश्य को एकत्र होने से रोक देगा और मेमोरी लीक होगा।

दो दृष्टिकोण।

  1. ध्यान में रखते हुए किसी भी घटना सदस्यता कोड-पीछे कमजोर (प्रिज्म में EventAggregator) कचरा संग्रहण अनुमति देने के लिए किया जाना चाहिए।
  2. एकता कंटेनर के साथ दृश्य का एक उदाहरण पंजीकृत करें और इसे पुन: उपयोग करने के दौरान इसे हल करें। इस क्षेत्र में इसे इंजेक्ट करने से पहले, बस DataContext को अपडेट करें।

उम्मीद है कि इससे मदद मिलती है।