2009-10-30 18 views
34

पर आधारित WPF ट्रिगर एक ट्रिगर के लिए ऑब्जेक्ट प्रकार पर तुलना करने का कोई तरीका है?ऑब्जेक्ट टाइप

<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type"> 
</DataTrigger> 

पृष्ठभूमि: मैं एक उपकरण पट्टी है और मैं बटन का क्या उपवर्ग वर्तमान में चयनित आइटम वस्तु के लिए निर्धारित है पर निर्भर करता है छिपाने के लिए चाहते हैं।

धन्यवाद

उत्तर

29

क्यों नहीं बस एक कनवर्टर है कि एक वस्तु लेता है और ऑब्जेक्ट प्रकार के एक स्ट्रिंग रिटर्न का उपयोग करें?

Binding="{Binding SelectedItem, Converter={StaticResource ObjectToTypeString}}"

और कनवर्टर परिभाषित के रूप में: इस मामले में

<Window.Resources> 
    <convs:ObjectToTypeStringConverter x:Key="ObjectToTypeString" /> 
</Window.Resources> 

जहाँ 'convs':

public class ObjectToTypeStringConverter : IValueConverter 
{ 
    public object Convert(
    object value, Type targetType, 
    object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.GetType().Name;    
    } 

    public object ConvertBack(
    object value, Type targetType, 
    object parameter, System.Globalization.CultureInfo culture) 
    { 
     // I don't think you'll need this 
     throw new Exception("Can't convert back"); 
    } 
} 

आप अपने XAML में कहीं स्थिर संसाधन घोषित करने के लिए की आवश्यकता होगी कनवर्टर कहां है नामस्थान है।

उम्मीद है कि इससे मदद मिलती है।

+10

+1, हालांकि कनवर्टर को इसके नाम के बजाय टाइप ऑब्जेक्ट वापस करना चाहिए ... –

+2

क्या यह काम करेगा? रनटाइम स्ट्रिंग को किसी प्रकार के प्रकार से तुलना नहीं कर सकता है? मुझे पता है कि यह अधिकांश मूल्य प्रकारों को परिवर्तित/तुलना करने में संभालता है लेकिन यह अन्य प्रकार की तुलनाओं को कैसे प्रबंधित करता है उससे परिचित नहीं है। – AndyG

+5

हां, यह काम करेगा, आपको केवल DataTrigger के मान में {x: Type} मार्कअप एक्सटेंशन का उपयोग करना होगा। –

4

एंडीजी द्वारा सुझाए गए कनवर्टर का उपयोग करना एक अच्छा विकल्प है। वैकल्पिक रूप से, आप प्रत्येक लक्ष्य प्रकार के लिए एक अलग DataTemplate का भी उपयोग कर सकते हैं। WPF स्वचालित रूप से DataTemplate चुनता है जो ऑब्जेक्ट प्रकार

+0

लेकिन यह उस डेटाटाइप – Staeff

42

से मेल खाता है यह @ एंडीजी के उत्तर पर आधारित है लेकिन यह थोड़ा सुरक्षित है क्योंकि यह दृढ़ता से टाइप किया गया है। प्रकार के लिए

public class DataTypeConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     return value.GetType(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

कनवर्टर का उपयोग करने के अपने DataTrigger परिवर्तित करें, और सेट मूल्य::

एक IValueConverter DataTypeConverter नाम है, जो एक वस्तु को स्वीकार करता है और उसके प्रकार देता है (एक System.Type के रूप में) को लागू करें

संसाधनों में
<DataTrigger Binding="{Binding SelectedItem, 
     Converter={StaticResource DataTypeConverter}}" 
     Value="{x:Type local:MyType}"> 
... 
</DataTrigger> 

प्रचार DataTypeConverter:

<UserControl.Resources> 
    <v:DataTypeConverter x:Key="DataTypeConverter"></v:DataTypeConverter> 
</UserControl.Resources> 
+1

के हर उप-प्रभाव को भी प्रभावित करेगा यह मेरे लिए काम नहीं करता है। यदि मैं DataTrigger.Value में मार्क अप एक्सटेंशन का उपयोग करने का प्रयास करता हूं तो मुझे XamlParseException मिलता है, इसलिए मैंने इसके बजाय स्ट्रिंग तुलना विधि का उपयोग किया है। यहां देखें: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/14cbdb99-fd33-4ad0-8b1b-a0139c7fbf95/ – RobJohnson

+3

बेहतर टाइप करें कि GetType() को आजमाने से पहले मान शून्य है या नहीं। वापसी मूल्य! = शून्य? मूल्य। गेट टाइप(): शून्य; – Viv

+0

'बाध्यकारी =" {बाध्यकारी चयनित Item} "कनवर्टर = {स्टेटिक संसाधन डेटाटाइप कनवर्टर}}" 'बाध्यकारी =" {बाध्यकारी चयनित इटैम, कनवर्टर = {स्टेटिक संसाधन डेटाटाइप कनवर्टर}} "' – Firo

3

एक ट्रिगर नहीं है लेकिन यह मेरे लिए काम करता है। (ट्रिगर-दृष्टिकोण नहीं था यह एक स्ट्रिंग के लिए एक चेकबॉक्स निर्माण नहीं कर सकता यह काफी Thomas Levesque's suggestion है।)

का उपयोग कर:

xmlns:mscorlib="clr-namespace:System;assembly=mscorlib" 

एक चेकबॉक्स या पाठ बॉक्स प्रकार के आधार पर:

<ContentPresenter Content="{TemplateBinding SelectedItem}"> 
     <ContentPresenter.Resources> 
       <DataTemplate DataType="{x:Type mscorlib:Boolean}"> 
        <CheckBox Height="25" Width="25" HorizontalAlignment="Left" IsChecked="{Binding Path=.}"/> 
       </DataTemplate> 
        <DataTemplate DataType="{x:Type mscorlib:String}"> 
        <TextBox Height="25" Width="200" HorizontalAlignment="Left" Text="{Binding Path=.}"/> 
       </DataTemplate> 
     </ContentPresenter.Resources> 
</ContentPresenter> 

नोट: ग्रेग Sansom के समाधान के लिए आप या तो स्ट्रिंग के रूप में प्रकार वापसी या mscorlib

ऊपर के रूप में उपयोग करने के लिए मिल गया है सामान्य विचार के लिए
संबंधित मुद्दे