wpf xaml types binding datatrigger

Disparador WPF basado en el tipo de objeto



xaml types (4)

¿Hay alguna forma de hacer una comparación en el tipo de objeto para un desencadenante?

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

Fondo: tengo una barra de herramientas y deseo ocultar el botón dependiendo de qué subclase está actualmente configurado para el objeto del elemento seleccionado.

Gracias


¿Por qué no usar un convertidor que toma un objeto y devuelve una cadena del tipo de objeto?

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

y define el convertidor como:

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

Deberá declarar el recurso estático en algún lugar de su xaml:

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

Donde ''convs'' en este caso es el espacio de nombres de donde está el convertidor.

Espero que esto ayude.


Esto se basa en la respuesta de @ AndyG, pero es un poco más seguro porque está muy tipado.

Implemente un IValueConverter denominado DataTypeConverter, que acepta un objeto y devuelve su Tipo (como un 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(); } }

Cambie su DataTrigger para usar el convertidor y establezca el valor para el tipo:

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

Declarar DataTypeConverter en los recursos:

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


No es un disparador, pero esto funcionó para mí. (El enfoque desencadenante no lo hizo, ya que no puede crear una casilla de verificación para una cadena. Esta es más o menos la sugerencia de Thomas Levesque )

utilizando:

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

Un CheckBox o TextBox dependiendo del tipo:

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

Nota: para la solución de Greg Sansom, debe devolver el tipo como Cadena o usar mscorlib como se indica anteriormente


Usar un convertidor como lo sugiere AndyG es una buena opción. Alternativamente, también podría usar un DataTemplate diferente para cada tipo de objetivo. WPF seleccionará automáticamente el DataTemplate que coincida con el tipo de objeto