2011-09-27 9 views
12

की 'गणना' करने के लिए नियंत्रण की बाध्यकारी दृश्यता मेरे पास एक आईनेमेरेबल <> में निहित वस्तुओं की एक सूची है। मैं इस सूची की गणना के आधार पर नियंत्रण की दृश्यता सेट करना चाहता हूं। मैंने कोशिश की है:एक आईनेमेरेबल

Visibility="{Binding MyList.Count>0?Collapsed:Visible, Mode=OneWay}" 

लेकिन यह काम नहीं करता है। मैंने MyList को बाध्य करने का प्रयास किया। टेक्स्ट ब्लॉक में पाठ को गणना करने के लिए यह सुनिश्चित करने के लिए कि गणना मान सही था, और यह है। यह दृश्यता को सही ढंग से सेट नहीं लग रहा है।

+0

ऐसा लगता है कि आप इसका उपयोग कर सकते हैं: http://www.11011.net/wpf-binding-expressions – Gabe

उत्तर

28

आप बाइंडिंग में तार्किक या कोड-अभिव्यक्तियों का उपयोग नहीं कर सकते (यह PropertyPath की अपेक्षा करता है)। या तो एक converter या ट्रिगर्स का उपयोग करें, जो है मैं क्या करना होगा: (। आप निश्चित रूप से एक resource में शैली refactor यदि आप चाहें तो कर सकते हैं)

<YourControl.Style>      
    <Style TargetType="YourControl"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding MyList.Count}" Value="0"> 
       <Setter Property="Visibility" Value="Visible" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</YourControl.Style> 

+0

धन्यवाद, यह बहुत अच्छा है - क्या आप जानते हैं कि कोई इसे संसाधन तत्व में कैसे दोबारा कर सकता है ताकि आप पास कर सकें अंतर में पैरामीटर के रूप में सूचीबद्ध करता है? – BKSpurgeon

+0

@BKSpurgeon: ठीक है, यह करना मुश्किल है यदि डेटा संदर्भ पर संपत्ति समान नहीं है, तो बाइंडिंग दुर्भाग्य से स्थिर हैं। यदि आपके पास विकल्प है तो आप कुछ सम्मेलन बना सकते हैं ताकि पथ विभिन्न डेटा संदर्भों के साथ काम करता हो, एक इंटरफ़ेस ताकि डेटा संदर्भ लागू हो सके, एक सूची संपत्ति प्रदान की जा सके जो हमेशा एक ही नाम हो। –

+0

@BKSpurgeon: मार्कअप एक्सटेंशन का उपयोग करके बाध्यकारी पथों को कम या कम गतिशील रूप से बनाने का विकल्प है, लेकिन संभवतः वे एप्लिकेशन के बजाय स्टाइल निर्माण समय पर निष्पादित करते हैं ताकि संभवतः कहीं भी न हो। –

0

आपको एक कनवर्टर का उपयोग करना चाहिए, जो गणना संपत्ति को दृश्यता मान में परिवर्तित करता है, या शायद एक नई "हैसटम्स" बूलियन संपत्ति को दृश्यता मान में परिवर्तित करता है। हम कुछ ऐसी चीजों का उपयोग करते हैं, उदाहरण के लिए, इस तरह की नौकरियों को संभालने के लिए, boolToVisibilityConvert कहा जाता है।

यदि आपको उनकी आवश्यकता है तो मैं आपको अधिक सटीक विवरण दे सकता हूं।

2
वहाँ

तीन तरीके है:

  1. एचबी द्वारा उल्लिखित ट्रिगर्स का उपयोग करने के लिए
  2. एक कक्षा में IValueConverter लागू करने और उस वर्ग
  3. में IValueConverter का एक उदाहरण के लिए बाइंडिंग अपने ViewModel में एक संपत्ति को परिभाषित करने के लिए सीधे दृश्यता राज्य लौटने के लिए की कनवर्टर संपत्ति की स्थापना द्वारा कन्वर्टर्स उपयोग करने के लिए।

आप हमेशा ट्रिगर्स विधि का उपयोग कर सकते हैं और यह हमेशा एक अच्छा दृष्टिकोण है। तीसरी विधि उपयोगी है (और सबसे अच्छी है) जब आप एमवीवीएम पैटर्न का उपयोग कर रहे हैं (और आप अपने व्यूमोडेल में यूआई संबंधित असेंबली को संदर्भित करने से खुद को प्रतिबंधित नहीं कर रहे हैं) मैं ट्रिगर्स का उपयोग करने का सुझाव देता हूं, लेकिन यदि आप अपने xaml को गंदे बनाना नहीं चाहते हैं अधिक मार्कअप कोड कन्वर्टर्स का उपयोग करें।

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