2010-10-06 13 views
5

हमारे उत्पाद में, हम एमवीवीएम मॉडल का पहला दृष्टिकोण उपयोग करते हैं और यह अच्छी तरह से काम करता है लेकिन एक चेतावनी के साथ। जब दृश्य जटिल हो जाता है तो इसे डेटा टेम्पलेट से बनाने में समय लगता है। यदि दृश्य अक्सर दिखाया जाता है और छुपाया जाता है, तो यह थोड़ा परेशान हो जाता है। यदि पहले दृश्य का उपयोग करना है, तो आवश्यक होने पर दृश्य को कैश करना काफी आसान होगा - लेकिन डेटा टेम्पलेट और मॉडल का उपयोग करते समय, हमारे पास दृश्य निर्माण का अधिक नियंत्रण नहीं है। किसी ने भी इस समस्या को पहले से ही दृश्य में स्विच किए बिना हल किया है?मॉडल के पहले दृष्टिकोण का उपयोग करते समय दृश्य को कैश करना संभव है?

उत्तर

3

व्यूमोडेल के पहले दृष्टिकोण के साथ मुझे लगता है कि आपको दृश्य को "कैश" करने का कोई मौका नहीं है। इसलिए आप हेवीवेट डेटामैट्स वर्कफ़्लोज़ के लिए पहले दृश्य और व्यूमोडेल लोकेटर का उपयोग करने पर विचार कर सकते हैं। here सूचियों के साथ डेटामैप्लेट का उपयोग करते समय एक समाधान है।

लेकिन शायद wpf डेटामैप्लेट तंत्र को ओवरराइड करने के साथ कोई समाधान है?

संपादित करें: यदि आप अपने व्यूमोडेल के लिए केवल "मार्कर्विव" बनाते हैं, तो wpf डेटामैप्लेट इसे ढूंढ सकता है। और फिर इस मार्कर दृश्य के भीतर आप वास्तविक दृश्य को बना/पुनर्निर्मित करते हैं? एक दृश्य सेवा लोकेटर की तरह कुछ?

+0

"मार्कर्व्यू" पर साफ विचार, मैं देखता हूं कि यह काम करता है ... –

+0

मुझे बताएं कि यह काम करता है;) – blindmeis

5

@blindmeis विचार का उपयोग करते हुए खूबसूरती से काम करता है।

समग्र नुस्खा:

एक ContentControl या UserControl नामित ViewCache बनाएँ:

public partial class ViewCache 
{ 
    public ViewCache() 
    { 
     InitializeComponent(); 
     Unloaded += ViewCache_Unloaded; 
    } 

    void ViewCache_Unloaded(object sender, RoutedEventArgs e) 
    { 
     Content = null; 
    } 

    private Type _contentType; 
    public Type ContentType 
    { 
     get { return _contentType; } 
     set 
     { 
      _contentType = value; 
      Content = ViewFactory.View(value); // use you favorite factory 
     } 
    } 
} 

DataTemplate में, ViewCache उपयोग करते हैं, वास्तविक दृश्य के प्रकार आप उपयोग करना चाहते पारित:

<Window.Resources> 
    <DataTemplate DataType="{x:Type TestViewCache:Foo}"> 
     <TestViewCache:ViewCache ContentType="{x:Type TestViewCache:View }"/> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <ContentPresenter Height="200" Width="300" 
     Content="{Binding ViewModel}"/> 
    <Button Content="Set VM" Click="SetVMClick"/> 
    <Button Content="UnSet VM" Click="UnSetVMClick"/>   
</StackPanel> 
+0

धन्यवाद लेकिनलिखना बेहतर होगाvar नियंत्रण = नियंत्रण के रूप में देखें; नियंत्रण। डेटाकॉन्टेक्स्ट = डेटाकॉन्टेक्स्ट; सामग्री = दृश्य; –

+0

अरे सर्गेई, मैं दृश्य कैश के लिए एक समाधान की तलाश में था और आपके कार्यान्वयन को मिला। मुझे समझ में नहीं आता कि मैं पैरेंट व्यूमोडेल से दृश्य मॉडल तक कैसे पहुंचूँगा। क्या मुझे 'व्यू कैश' भी एक्सेस करना है? और फिर मुख्य दृश्य मॉडल में दृश्य के परिवर्तन को कैसे लागू किया गया है? – derape

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

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