有沒有辦法對觸發器的對象類型進行比較?基於對象類型的WPF觸發器
<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type">
</DataTrigger>
背景:我有一個工具欄,我想隱藏按鈕的取決於什麼子類當前設置爲所選擇的項目對象。
感謝
有沒有辦法對觸發器的對象類型進行比較?基於對象類型的WPF觸發器
<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type">
</DataTrigger>
背景:我有一個工具欄,我想隱藏按鈕的取決於什麼子類當前設置爲所選擇的項目對象。
感謝
爲什麼不直接使用一個轉換器,它接受一個對象,並返回對象類型的字符串?
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'是轉換器所在的命名空間。
希望這會有所幫助。
使用AndyG建議的轉換器是一個不錯的選擇。或者,您也可以爲每種目標類型使用不同的DataTemplate
。 WPF會自動選擇DataTemplate
與對象類型相匹配
但它也會影響該數據類型的每個子元素 – Staeff 2013-06-25 07:32:17
這是基於@ 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>
這對我不起作用。如果我嘗試在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
在嘗試GetType()之前,檢查值是否爲null。返回值!= null? value.GetType():null; – Viv 2013-03-18 17:20:52
'Binding =「{Binding SelectedItem}」Converter = {StaticResource DataTypeConverter}}「'應該是'Binding =」{Binding SelectedItem,Converter = {StaticResource DataTypeConverter}}「' – Firo 2013-08-19 07:06:05
不是觸發器,但這對我有效。 (該觸發器的方法並沒有因爲它不能創建一個字符串複選框,這是非常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如上
+1爲一般的想法,但是轉換器應該返回Type對象而不是它的名字...... – 2009-10-31 02:44:01
這樣做會工作嗎?運行時不會將String類型的東西與Type類型的東西進行比較嗎?我知道它處理轉換/比較大多數值類型,但不熟悉它如何處理其他類型比較。 – AndyG 2009-10-31 04:30:36
是的,它可以工作,您只需在DataTrigger的值中使用{x:Type}標記擴展。 – 2009-10-31 13:39:15