2009-10-30 35 views
34

有沒有辦法對觸發器的對象類型進行比較?基於對象類型的WPF觸發器

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

背景:我有一個工具欄,我想隱藏按鈕的取決於什麼子類當前設置爲所選擇的項目對象。

感謝

回答

29

爲什麼不直接使用一個轉換器,它接受一個對象,並返回對象類型的字符串?

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

並定義轉換器:

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中:在這種情況下

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

其中 'convs'是轉換器所在的命名空間。

希望這會有所幫助。

+10

+1爲一般的想法,但是轉換器應該返回Type對象而不是它的名字...... – 2009-10-31 02:44:01

+2

這樣做會工作嗎?運行時不會將String類型的東西與Type類型的東西進行比較嗎?我知道它處理轉換/比較大多數值類型,但不熟悉它如何處理其他類型比較。 – AndyG 2009-10-31 04:30:36

+5

是的,它可以工作,您只需在DataTrigger的值中使用{x:Type}標記擴展。 – 2009-10-31 13:39:15

4

使用AndyG建議的轉換器是一個不錯的選擇。或者,您也可以爲每種目標類型使用不同的DataTemplate。 WPF會自動選擇DataTemplate與對象類型相匹配

+0

但它也會影響該數據類型的每個子元素 – Staeff 2013-06-25 07:32:17

42

這是基於@ AndyG的回答,但是因爲它是強類型的,所以更安全一些。

實施名爲DataTypeConverter一個的IValueConverter,它接受一個對象,並返回其類型(作爲System.Type的):

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使用轉換器,並設置值類型:

<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 2012-12-04 15:05:50

+3

在嘗試GetType()之前,檢查值是否爲null。返回值!= null? value.GetType():null; – Viv 2013-03-18 17:20:52

+0

'Binding =「{Binding SelectedItem}」Converter = {StaticResource DataTypeConverter}}「'應該是'Binding =」{Binding SelectedItem,Converter = {StaticResource DataTypeConverter}}「' – Firo 2013-08-19 07:06:05

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> 

注:格雷格 - 桑塞姆的解決方案,您要麼得返回類型爲字符串或使用的mscorlib如上