2010-02-01 14 views
13

मेरे पास Expander है IsExpanded संपत्ति एमवीवीएम मॉडल में एक बूल से बंधी है। बाइंडिंग ठीक काम करता है जब तक कि आप विस्तारक को स्पर्श न करें। एक बार विस्तार करने के लिए विस्तारक में तीर पर क्लिक करने के बाद, बाध्यकारी काम करना बंद कर देता है। मॉडल में झूठ के लिए बूल शोप्रूव्यू सेट करना विस्तारक को पतन नहीं करता है।डब्ल्यूपीएफ एक्सपेंडर IsExpanded बाध्यकारी

<Expander Name="pExpander" 
      IsExpanded="{Binding Path=ShowPreview,Mode=OneWay}" 
      Header="Preview"> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
+0

क्या आपकी ऑब्जेक्ट संपत्ति के साथ शोप्रेव इनोटिटीप्रॉपर्टी चेंज इंटरफ़ेस को लागू करती है और आपकी संपत्ति बदल जाती है तो ईवेंट को बढ़ाती है? – mattythomas2000

+1

बाइंडिंग मोड दोवे होना चाहिए। जैसे ही आप विस्तारक पर विस्तार करते हैं, वनवे बाध्यकारी ढहने और विस्तार ढांचे को नियंत्रित किया जाता है। – apandit

+0

धन्यवाद! दोवे काम करता है। लेकिन यह क्यों काम नहीं कर सकता है? मुझे केवल बाहरी घटना के आधार पर विस्तार और पतन को नियंत्रित करने वाले मॉडल में दिलचस्पी है जो इसे सही या गलत पर सेट करता है। यदि ढांचा विस्तारक को फैलाता है या ढहता है तो मुझे उस मूल्य में दिलचस्पी नहीं है जो मॉडल में वापस सेट किया जा रहा है। – netraju

उत्तर

7

यदि आप Mode=OneWay हटाते हैं तो समस्या को हल करता है?

अपना अन्य सीटीक्यू पढ़ने पर (जीयूआई में परिवर्तन मॉडल को प्रभावित नहीं करते हैं), मेरे पास अंतर्निहित डेटा द्वारा किए गए परिवर्तन को सीमित करने के लिए एक अच्छा सुझाव नहीं है। क्या में अंतर है:

myModel.MyProperty = true; // in *your* code behind 

और

myModel.MyProperty = true; // done by a binding 
+0

हां हटाने मोड = ऑनवे काम करता है। – netraju

0

तीन बातें करते हैं,

सुनिश्चित करें कि आपके ViewModelINotifyPropertyChanged लागू कर रहा है सुनिश्चित करें। आपका ui अभ्यस्त बदलाव के बारे में यदि आपके विचार मॉडल does not को यह सूचित जब संपत्ति TwoWay के मोड में परिवर्तन

बदलें, आप अपने दृश्य मॉडल अद्यतन जब विस्तारक परिवर्तन और आप अपने विस्तारक अद्यतन जब दृश्य मॉडल में परिवर्तन

चाहते हैं

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

मुझे पता है कि रेडियो बटन के साथ कोई समस्या थी कि समूह में एक और बटन सेट होने पर वे अपनी बाइंडिंग खो देंगे, मुझे नहीं लगता कि यह मुद्दा है, हालांकि एक डीबग कनवर्टर आपको यह समझने में मदद करेगा।

+0

उत्तरों के लिए धन्यवाद। हां मॉडल INotifyPropertyChanged लागू करता है। जब तक आप विस्तारक को स्पर्श नहीं करते हैं तब तक बाइंडिंग ठीक काम करती है। जैसे ही आप विस्तार करने के लिए विस्तारक पर माउस क्लिक करते हैं, बाध्यकारी अब और काम नहीं करता है। डीबग में आप देख सकते हैं कि IsExpanded या तो सत्य या गलत पर सेट हो रहा है। लेकिन दृष्टि से विस्तारक विस्तारित रहता है। – netraju

+0

अगर आप पर, डिबग कनवर्टर हिट हो रही रखता है डिबग कनवर्टर डाल हर बार जब आप संक्षिप्त रूप बदलते हैं? –

5

क्या मुझे यहाँ कैच आउट कि IsExpandedOneWay डिफ़ॉल्ट रूप से है, इसलिए

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded}"/> 
</Style> 

तरह से मैं उम्मीद से काम नहीं करता है। सिर्फ अगर आप Mode=TwoWay जोड़ने, तो यह काम करता है (यानी आइटम मेरी Expanded संपत्ति पर ध्यान दे रही है, और यह अद्यतन करने के लिए शुरू होता है),

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded, Mode=TwoWay}"/> 
</Style> 
1
सिल्वरलाइट साथ

में के रूप में मैं यह कर:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

<Expander Name="pExpander" IsExpanded="True" Header="Preview"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
<Expander Name="pExpander1" IsExpanded="True" Header="Preview 1"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message1, Mode=OneWay}"></TextBlock>  
</Expander> 
//... 

बाध्यकारी जब आप मैन्युअल रूप से एक एक्सपेंडर का विस्तार/पतन करते हैं तो खो नहीं जाता है ...

+0

केवल एक चीज मैं WPF के लिए बदलना पड़ा propertychangedtrigger और मूल्य के लिए विकल्पों में था, बाइंडिंग पथ = ShowPreview। इसके अलावा, यह मेरे लिए बिल्कुल सही था, धन्यवाद। –

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