2013-01-11 33 views
26

मैं WPF सीख रहा हूँ और मैं निम्नलिखित समस्या हुई है:मैं एक्सएएमएल में एनम प्रकारों का उपयोग कैसे कर सकता हूं?

मैं अपने XAML तुलना में एक और नाम स्थान में एक enum प्रकार है:

public enum NodeType 
    { 
     Type_SYSTEM = 1,    // System 
     Type_DB = 2,     // Database 
     Type_ROOT = 512,    // Root folder 
     Type_FOLDER = 1024,   // Folder 
    } 

मेरी XAML में मैं चाहूँगा एक के साथ एक छवि को गति प्रदान करने पूर्णांक

<Image.Style> 
    <Style TargetType="{x:Type Image}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Type}" Value="{NodeType: }"> 
       <Setter Property="Source" Value="/Images/DB.PNG"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Type}" Value="128"> 
       <Setter Property="Source" Value="/Images/SERVER.PNG"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Image.Style> 

वहाँ एक रास्ता एक पूर्णांक मूल्य मिलता है और एक enum के साथ तुलना करना XAML कोड में सीधे टाइप है?

मेरे enum AnotherNamespace.Types

<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB"> 
             <Setter Property="Source" Value="/Images/SERVER.PNG"/> 

उत्तर

39

मैं एक ऐसी ही सवाल here था नाम स्थान में है, और मेरी अंतिम परिणाम एक सामान्य IValueConverter कि enum मूल्य मैं के रूप में में मिलान करना चाहते थे पारित किया बनाने के लिए था ConverterParameter, और यह true या false पर निर्भर करता है कि बाध्य मान (int) एनम के मान से मेल खाता है या नहीं।

XAML कोड::

<DataTrigger Value="True" 
      Binding="{Binding SomeIntValue, 
       Converter={StaticResource IsIntEqualEnumConverter}, 
       ConverterParameter={x:Static local:NodeType.Type_DB}}"> 

कनवर्टर

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (parameter == null || value == null) return false; 

    if (parameter.GetType().IsEnum && value is int) 
    { 
     return (int)parameter == (int)value; 
    } 
    return false; 
} 
+0

उत्तर के लिए धन्यवाद! अगर मेरा "नोड टाइप" एक और नेमस्पेस में है, तो मैं xaml में कैसे आयात कर सकता हूं? – davymartu

+0

@ user1696549 आप रूट टैग में 'xmlns' का उपयोग करके अपने एक्सएएमएल में अन्य नामस्थान जोड़ सकते हैं। उदाहरण के लिए, यह लाइन असेंबली 'MyAssembly' से नाम 'माई नेमस्पेस' को एक्सएएमएल फ़ाइल में जोड़ देगा, और इसे उपसर्ग '' स्थानीय '':' xmlns: local = "clr-namespace: MyAssembley.MyNamespace द्वारा संदर्भित किया जा सकता है ; असेंबली = MyAssembly "' – Rachel

+0

मैंने नामस्थान को सफलतापूर्वक आयात किया है, लेकिन xaml मुझे बताता है कि "नोड टाइप" नामस्थान में मौजूद नहीं है ... मेरा नामस्थान "XFramework.domain.helpers" है और मेरा enum XHelper क्लास में है एक ही नामस्थान। – davymartu

8

तुम बस सुनिश्चित करें कि आपके नाम स्थान अपने XAML शीर्षक में हिसाब-के लिए किया जाता है बनाने की जरूरत है

अंतिम परिणाम इस तरह दिखता है तो आप सीधे अपने मार्कअप में दोनों कस्टम डीपी और एनम मानों का संदर्भ दे सकते हैं।

उदाहरण के लिए मैं इस कोड का उपयोग सिर्फ इतना है कि ऐसा करने के लिए:

<DataTemplate.Triggers> 
    <MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" /> 
     <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" /> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.Setters> 
     <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" /> 
    </MultiDataTrigger.Setters> 
    </MultiDataTrigger> 
</DataTemplate.Triggers> 

ध्यान दें कि यदि आप एक शैली में DataTriggers उपयोग नहीं कर सकते, आप के बजाय (.NET एक DataTemplate या ControlTemplate कि के लिए बनाने के लिए हालांकि, जरूरत 4 शैलियों में ट्रिगर्स सेट करने की क्षमता जोड़ता है)। तुम इतनी तरह एक शैली से ControlTemplate ओवरराइड कर सकते हैं:

<Style x:Key="MyCustomButtonStyle" TargetType="Button"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <ContentPresenter /> 
     <ControlTemplate.Triggers> 
      <!-- Put your DataTriggers here --> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

DataTemplates के लिए आप किसी ऑब्जेक्ट को बाइंडिंग, तो आप बस एक ContentPresenter उपयोग कर सकते हैं करना चाहते हैं और वस्तु के लिए अपनी सामग्री सेट करते समय DataTemplate के साथ-साथ प्रदर्शित करना चाहते हैं वस्तु के प्रदर्शन के लिए उपयोग करने की परिभाषा। डेटाट्रिगर्स का उपयोग करने का हमेशा एक तरीका है, यह हमेशा स्टाइल का उपयोग करने के रूप में हमेशा प्रत्यक्ष या सरल नहीं होता है।

+1

हां आप एक्सएएमएल में एनम से एनम की तुलना कर सकते हैं जैसे कि आप यहां प्रदर्शित करते हैं, लेकिन यह सवाल एनम से एक इंटीजर की तुलना करने के बारे में है, जिसे आप कनवर्टर या कस्टम व्यवहार के बिना जानते हैं। इसके अलावा, हाँ, आप प्रश्न के उदाहरण कोड में प्रदर्शित ओपी के रूप में एक स्टाइल में ट्रिगर्स डाल सकते हैं :) – Rachel

+0

मेरे पास प्रश्न शीर्षक संपादित करने की प्रतिष्ठा नहीं है, लेकिन मैं तर्क दूंगा कि शीर्षक भ्रामक है: "कैसे क्या मैं एक्सएएमएल में एनम प्रकार का उपयोग कर सकता हूं? " पूर्णांक और पूर्णांक तुलना के बारे में कुछ भी नहीं कहता है, शीर्षक अधिक स्पष्ट होगा "मैं XAML में पूर्णांक की तुलना कैसे कर सकता हूं?" इसके अलावा, आप स्टाइल तत्व में डेटा ट्रिगर नहीं डाल सकते हैं, सामान्य ट्रिगर बाइंडिंग का परीक्षण नहीं कर सकते हैं। – tpartee

+0

पूरे प्रश्न को पढ़ने के लिए महत्वपूर्ण है, शीर्षक नहीं। मैं वास्तव में बदलाव नहीं करना चाहता क्योंकि यह एक पुराना सवाल है और यह इसे शीर्ष पर टक्कर देगा, लेकिन अगर यह एक नया सवाल था तो मैं चाहता था। :) इसके अलावा, शायद मैं गलत कह रहा हूं कि आप क्या कह रहे हैं, लेकिन मैं काफी सकारात्मक हूं कि आप डेटा ट्रिगर को स्टाइल में डाल सकते हैं। ट्रिगर। मुझे हर व़क्त यह करना है। – Rachel