2015-12-15 5 views
14

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

<ItemsControl 
    ItemsSource="{Binding ChildPanels.Values}" 
    Name="ContentControl1" 
    > 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}" 
      Visibility="{Binding Path=Active, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

बच्चे तत्वों को अपने स्वयं के ViewModels हैं और मैं कुछ संसाधनों नदी के ऊपर तो वहाँ उनके लिए DataTemplates हैं घोषित मिल गया है। अगर इससे मदद मिलेगी तो मैं विस्तार से बता सकता हूं, लेकिन समस्या का पकड़ने वाला तत्व यह है:

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

लेकिन मास्टर नियंत्रण किसी अन्य डेटा स्रोत के लिए महत्वपूर्ण है, और मैं गारंटी नहीं दे सकता कि पहले रिकॉर्ड में कॉम्प्लेक्स चाइल्ड एलिमेंट होगा, जो एक बड़े डिस्प्ले फ्रेमवर्क द्वारा शुरू करने पर लोड किया गया है, मैं वास्तव में चारों ओर रूट नहीं करना चाहता इस समय में।

तो मैं कैसे गारंटी दे सकता हूं कि फॉर्म लोड होने पर कॉम्प्लेक्स चाइल्ड एलिमेंट प्रदान किया जाएगा, और संभवतः इसे तुरंत बाद में छुपाएं? मैं पहले से ही चालू और बंद टॉगल ChildPanels.Active इसके पीछे समारोह के अंदर की कोशिश की है:

<dxmvvm:Interaction.Triggers> 
    <dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" /> 
</dxmvvm:Interaction.Triggers> 

लेकिन है कि उन्हें प्रस्तुत करने के लिए नहीं मिलता है।

कि समारोह, वैसे:

foreach (var childModel in ChildPanels.Values) 
    { 
    childModel.Active = true; 
    RaisePropertyChanged(() => childModel.Active); 
    } 
ChangeChildModel(); 
पिछले समारोह कॉल एक बच्चे को मॉडल दृश्यता बदलने के लिए जब रिकॉर्ड परिवर्तन कहा जाता होने के साथ

। अगर मैं वह अंतिम कॉल नहीं करता हूं, तो सभी बच्चे के दृश्य मॉडल दिखाई देते हैं।

+0

"मैं पहले से ही ChildPanels.Active टॉगल की कोशिश की है इस के पीछे समारोह के अंदर और बंद: ... लेकिन यह उन्हें प्रस्तुत करने के लिए नहीं मिलता है। " मुझे लगता है कि दृश्य को पूर्व-प्रस्तुत करने के लिए यह एक अच्छी जगह है। लेकिन यह बिल्कुल क्यों नहीं दिखाता है? – Tyress

+0

आईडीके, हालांकि मैंने इस सवाल को स्वयं प्रश्न में जोड़ा। जब मैं डीबग मोड में चीजें चलाता हूं और फ़ंक्शन में ब्रेकपॉइंट चिपकाता हूं, तो यह वास्तव में कोई दृश्यमान UI तत्व नहीं देखता है जब यह चल रहा है, अगर यह मदद करता है। – Glazius

+0

ChangeChildModel() क्या करता है? :) यदि आप इसका निपटारा कर रहे हैं तो आप वास्तव में इसे पूर्व-प्रस्तुत नहीं कर रहे हैं, है ना? – Tyress

उत्तर

2

क्यों शुरुआत से झूठी दाएं दृश्यता सेट करना नहीं है? यह आपको बाद में सक्रिय पर बाइंडिंग का उपयोग करने से नहीं रोकता है।

बाइंडिंग ठीक है, लेकिन पता करने के लिए के रूप में यह माता पिता के नियंत्रण से दृश्यता और संशोधित करने के लिए DataTemplate द्वारा प्रयोग किया जाता है कि क्या यह बच्चा नियंत्रण प्रस्तुत करना चाहिए। तो पर सदस्यता आदेश के आधार पर संपत्तिChanged घटना, अभिभावक नियंत्रण नियंत्रण के रूप में नियंत्रण देख सकता है या नहीं।

वैसे, मैं सोच रहा हूं कि आपका पहला लक्ष्य पर कॉल करते समय हो सकता है कि कई नियंत्रणों पर पर कॉल करें या छुपाएं। मुझे यकीन नहीं है कि पूर्व प्रतिपादन उस के लिए सही तय है।

अस्थिर का मूल कारण पर निर्भर करता है, वहाँ पहले से ही इतने पर कई सुधारों हैं:

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