2009-10-30 9 views
34

Tetikleyici için nesne türü üzerinde karşılaştırma yapmanın bir yolu var mı?WPF Nesneye Dayalı Tetikleyici

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

Amaç: Bir araç çubuğu var ve düğmenin seçili öğe nesnesine ayarlamak hangi alt sınıf bağlı Hide istiyorum.

Teşekkür

cevap

29

sadece bir nesne alır ve nesne türünde bir dize döndürür bir dönüştürücü kullanın Neden?

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

gibi dönüştürücü tanımlar: bu durumda

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

'convs': Eğer xaml yere statik kaynak bildirmek gerekir

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"); 
    } 
} 

dönüştürücünün bulunduğu ad alanıdır.

Bu yardımcı olur umarım.

+10

+1, ancak dönüştürücü onun adı yerine Type nesnesini döndürmelidir ... –

+2

Bu işe yarar mı? Çalışma zamanı, Type Type türünde bir şey tip String ile karşılaştıramaz mı? Biliyorum çoğu değer türünü dönüştürmeyi/karşılaştırmayı idare ediyor, ancak diğer Tür karşılaştırmaları nasıl kullandığını bilmiyorum. – AndyG

+5

Evet, işe yarar, sadece DataTrigger değerinde {x: Type} işaretleme uzantısını kullanmanız gerekir. –

4

AndyG tarafından önerilen şekilde bir dönüştürücü kullanmak iyi bir seçenektir. Alternatif olarak, her bir hedef türü için farklı bir DataTemplate kullanabilirsiniz. WPF,

+0

Ancak, bu datatype – Staeff

42

Nesne türüyle eşleşen DataTemplate'u otomatik olarak seçecektir. Bu, @ AndyG'nin yanıtına dayanmaktadır, ancak biraz daha güvenli olduğu için daha güvenlidir. Tip değer

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(); 
    } 
} 
Converter kullanmak için DataTrigger değiştirin

ve set:

bir nesneyi kabul eder ve (System.Type gibi) Tipi döndüren DataTypeConverter adında bir IValueConverter, Uygulamak

kaynaklarda
<DataTrigger Binding="{Binding SelectedItem, 
     Converter={StaticResource DataTypeConverter}}" 
     Value="{x:Type local:MyType}"> 
... 
</DataTrigger> 

Declare DataTypeConverter:

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

'un tüm alt öğelerini de etkiler. Bu benim için çalışmaz. DataTrigger.Value'da bir işaret uzantısı kullanmaya çalıştığımda bir XamlParseException alıyorum, bu yüzden dize karşılaştırma yöntemini kullandım. Bakınız: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/14cbdb99-fd33-4ad0-8b1b-a0139c7fbf95/ – RobJohnson

+3

GetType() 'ı denemeden önce değerin null olup olmadığını kontrol edin. dönüş değeri! = null? value.GetType(): null; – Viv

+0

'Binding =" {SelectedItem} "Dönüştürücü = {StaticResource DataTypeConverter}}" 'olmalıdır Binding =" {SelectedItem, Dönüştürücü = {StaticResource DataTypeConverter}} " – Firo

3

Bir tetik değil ama bu benim için çalıştı. (Tetik yaklaşım bir dize için bir onay kutusu oluşturamazsınız olarak vermedi Bu Thomas Levesque's suggestion oldukça fazla.)

kullanarak:

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

CheckBox veya TextBox tipine göre:

<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> 

Not: Greg Sansom en çözümü için ya dize olarak türünü iade veya

yukarıdaki gibi mscorlib kullanmak lazım Genel fikir için