2009-11-06 15 views
9

Tengo un ListBox que muestra datos sobre empleados tales como nombre, foto del departamento, número de placa, etc. Los empleados pueden tener diferentes tipos, tales como Gerente, Personal, Voluntarios. Tengo 3 plantillas de datos separadas, una para cada tipo. Todas estas plantillas muestran básicamente los mismos datos, pero presentados de manera diferente.WPF - Parámetros para DataTemplates?

Dependiendo del usuario que haya iniciado sesión en las imágenes de la aplicación, el número de placa, etc., puede o no ser visible. Así que tengo propiedades booleanas para eso: CanSeePhotos, CanSeeBadgeNumbers, etc. Así que si CanSeePhotos == falso, todas las plantillas de datos deberían ocultar las fotos.

Mi pregunta es, ¿cómo puedo usar estas propiedades booleanas dentro de mis plantillas de datos para alternar la visibilidad de los elementos apropiados? ¿Hay alguna forma de pasar parámetros a las plantillas de datos cuando las devuelvo desde TemplateSelector?

Gracias!

edición: siguiendo la idea de Ray terminé haciendo esto:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}" 

Respuesta

4

En realidad no es una forma de personalizar DataTemplates ya que se devuelven desde el TemplateSelector envolviéndolos dentro de un FrameworkElementFactory, pero es demasiado complejo para tus necesidades

Para su caso hay dos soluciones que son mucho más fáciles: activadores y convertidores.

disparadores

Usted puede utilizar un disparador dentro de la DataTemplate. Por ejemplo, proporcione el cuadro de texto o el panel donde se muestra el número de identificación an x: Name, luego cree un DataTrigger en la propiedad CanSeeBadgeNumebers. Agregue un setter al DataTrigger y establezca la propiedad Visible en Oculto o Colapsado, haciendo referencia por su nombre.

idea básica:

<DataTemplate> 
    ... 
    <DockPanel x:Name="BadgeNumberPanel"> 
    <Label ... /> 
    <TextBox ... /> 
    </DockPanel> 
    ... 

    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true"> 
     <Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

convertidores

Se puede crear un IValueConverter en el código que convierte el tipo "bool" a "visibilidad" de tipo (hay muchos ejemplos por ahí se puede cortar y pegar), luego unir la visibilidad de TextBox a CanSeeBadgeNumbers, usando el convertidor.

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

cómo lo hago

utilizo realmente una técnica diferente para mi propio código: Mi bases de datos incluye una MarkupExtension escribí que llama mi núcleo C# analizador de expresiones, por lo que puede decir algo como:

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

Desafortunadamente, mi base de datos aún no se ha liberado. Cuando lo haga, planeo hacerlo de forma gratuita y de código abierto, pero aún faltan unos meses para que llegue.

+1

Si su CanSeeBadgeNumber no es una propiedad de los datos sino del entorno, es posible que deba agregar algo como Source = "{x: Static UserInfo.CurrentUser}" a su enlace. Esto es lo mismo ya sea que use desencadenadores o convertidores. –

+1

Expresiones en enlaces XAML! He estado esperando eso durante mucho tiempo, realmente lo extraño en mis días Flex. Esperando verlo! – Grokys

+4

Entonces, ¿alguna vez lo liberó? – BrainSlugs83