2009-11-06 15 views
9

मेरे पास एक सूची बॉक्स है जिसमें नाम, विभाग फोटो, बैज संख्या आदि जैसे कर्मचारियों के बारे में डेटा दिखाया गया है। कर्मचारियों के पास प्रबंधक, कर्मचारी, स्वयंसेवकों जैसे विभिन्न प्रकार हो सकते हैं। मेरे पास 3 अलग-अलग डेटा टेम्पलेट्स हैं - प्रत्येक प्रकार के लिए एक। इन सभी टेम्पलेट्स मूल रूप से एक ही डेटा दिखाते हैं लेकिन अलग-अलग प्रस्तुत करते हैं।WPF - डेटा टेम्पलेट्स पर पैरामीटर्स?

एप्लिकेशन चित्रों में लॉग इन किए गए उपयोगकर्ता के आधार पर, बैज संख्या, आदि, दिखाई दे सकते हैं या नहीं देख सकते हैं। तो मेरे पास इसके लिए बुलियन गुण हैं - CanSeePhotos, CanSeeBadgeNumbers, आदि। तो यदि CanSeePhotos == झूठी है, तो सभी डेटा टेम्पलेट्स को फ़ोटो छिपाना चाहिए।

मेरा सवाल है, मैं उचित डेटा की दृश्यता को टॉगल करने के लिए अपने डेटा टेम्पलेट्स के अंदर इन बुलियन गुणों का उपयोग कैसे कर सकता हूं? डेटा टेम्पलेट्स को पैरामीटर पास करने का कोई तरीका है क्योंकि मैं उन्हें अपने टेम्पलेट चयनकर्ता से वापस भेजता हूं?

धन्यवाद!

संपादित करें: रे के विचार निम्नलिखित मैं यह कर समाप्त हो गया:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}" 

उत्तर

4

असल में वहाँ है DataTemplates अनुकूलित करने के लिए के रूप में वे उन्हें एक FrameworkElementFactory अंदर लपेटकर द्वारा TemplateSelector से लौटे हैं, लेकिन यह बहुत बहुत जटिल है एक तरह से आपकी जरूरतों के लिए।

आपके मामले में दो समाधान हैं जो बहुत आसान हैं: ट्रिगर और कन्वर्टर्स।

ट्रिगर

आप DataTemplate के अंदर एक ट्रिगर का उपयोग कर सकते हैं। उदाहरण के लिए, टेक्स्टबॉक्स या पैनल दें जहां आप बैज संख्या को x: नाम प्रदर्शित करते हैं, फिर CanSeeBadgeNumebers प्रॉपर्टी पर DataTrigger बनाएं। डेटाट्रिगर में एक सेटर जोड़ें और दृश्यमान संपत्ति को छिपे हुए या संक्षिप्त करने के लिए सेट करें, इसे नाम से संदर्भित करें।

बुनियादी विचार:

<DataTemplate> 
    ... 
    <DockPanel x:Name="BadgeNumberPanel"> 
    <Label ... /> 
    <TextBox ... /> 
    </DockPanel> 
    ... 

    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true"> 
     <Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

कन्वर्टर्स

आप कोड है कि धर्मान्तरित "bool" प्रकार "दृश्यता" प्रकार (वहाँ कई उदाहरण सारे हैं आप कटौती कर सकते हैं करने के लिए एक IValueConverter बना सकते हैं और पेस्ट करें), फिर कनवर्टर का उपयोग करके टेक्स्टबॉक्स की दृश्यता को CanSeeBadgeNumbers पर बाध्य करें।

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

मैं इसे कैसे

मैं वास्तव में अपने खुद के कोड के लिए एक अलग तकनीक का उपयोग करें: मेरे डेटा नींव एक MarkupExtension मैंने लिखा है कि मेरे कोर सी # अभिव्यक्ति पार्सर कॉल भी शामिल है, इसलिए मैं कुछ ऐसा कह सकते हैं

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

दुर्भाग्य से मेरे डेटा नींव अभी तक जारी नहीं किया गया है। जब ऐसा होता है, तो मैं इसे मुक्त और मुक्त स्रोत बनाने की योजना बना रहा हूं, लेकिन यह अभी तक कुछ महीने दूर है।

+1

यदि आपका CanSeeBadgeNumber डेटा की संपत्ति नहीं है लेकिन पर्यावरण के लिए आपको अपने बाध्यकारी में स्रोत = "{x: स्टेटिक UserInfo.CurrentUser}" जैसे कुछ जोड़ना पड़ सकता है। यह वही है चाहे आप ट्रिगर या कन्वर्टर्स का उपयोग करें। –

+1

एक्सएएमएल बाइंडिंग में अभिव्यक्तियां! मैं इसके लिए लंबे समय से इंतजार कर रहा हूं - वास्तव में इसे मेरे फ्लेक्स दिनों से याद आती है। उसे देखने के लिए उत्सुक! – Grokys

+4

तो, क्या आपने इसे कभी जारी किया? – BrainSlugs83

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