2010-09-15 7 views
6

Tengo un control de usuario (NameField). Dentro de él tengo un stackpanel que contiene 3 Grids: StandardView, FluidView, OtherView. Dentro del código subyacente tengo una DependencyProperty llamada View of type NameFieldView (enum). La enumeración contiene STANDARD, FLUID, OTHER.Encuadernación por gatillo WPF: ¿Cuál es la mejor manera de vincular un valor enum a la visibilidad?

Creo que tengo que crear un convertidor, pero no estoy seguro de si es necesario. Básicamente quiero hacer que la única cuadrícula visible sea la que coincida con el valor enum ... es decir, si View = NameFieldView.STANDARD, la cuadrícula llamada Vista estándar está visible y las otras dos no.

Además, no estoy seguro de si esto debería ser parte de Grid.Resources/Style o Grid.Triggers?

+0

Nota al costado: tenga cuidado al usar "Ver" como nombre de propiedad. Significa algo muy específico hoy en día con el patrón Model-View-ViewModel que es el modus operandi preferido en el mundo de WPF. –

+0

Podría llamarlo "NameFieldVisualState" Supongo y VisualState. Pero sí, arrojé la precaución al viento :) –

Respuesta

7

Al igual que un montón de WPF, realmente depende de su gusto. Aquí hay algunas opciones.

Puede crear tres IValueConverter que convierta el valor de la propiedad Ver a Visibilidad (o use el nombre de la enumeración como un parámetro convertidor y cree un convertidor).

Puede crear tres nuevas propiedades llamadas "StandardViewIsVisible", "FluidViewIsVisible" y "OtherViewIsVisible" que se actualizan cuando cambia la propiedad View. Estas propiedades serían de tipo de retorno Visibilidad. Esto es decididamente una forma de hacer "MVVM", incluso si no está usando ViewModel.

Puede usar un DataTrigger que establece la cuadrícula adecuada Visible o Contraída en función del valor actual de la propiedad Ver.

+1

De hecho fui con un ValueConverter y utilicé un parámetro para decidir qué vista controlar. 'Fluid' comprueba si View está configurado en Fluid. 'Otro' se comprobó para ver si Vista era Estándar o Extendida. Y dentro de esa grilla, 2 elementos del cuadro combinado pasaron en 'Extendido' para ver si la Vista estaba extendida. ¡Hurra! –

1

Crearía un convertidor. Si agrega un convertidor cada vez que tenga un problema de enlace adecuado como este, construirá lentamente una biblioteca de ellos para su aplicación, lo que hará las cosas mucho más fáciles para usted en el futuro. Yo diría que es algo así como NameFieldViewToVisibilityConverter - debe tener dos métodos:

public Object Convert(Object value, Type TargetType, Object param, CultureInfo Culture); 
public Object ConvertBack(Object value, Type TargetType, Object param, CultureInfo Culture); 

Convertir tendrá un parámetro NameFieldView y devuelve un valor de visibilidad. ConvertBack tendrá un parámetro de Visibilidad y devolverá un valor de NameFieldView.

Los enlaces se vería así:

<Grid Name="StandardView" Visibility="{Binding View, Converter={StaticResource NameFieldViewToVisibilityConverter}" /> 
10

uso de datos activa para esto. Se ve algo como esto;

<Style TargetType="DockPanel" x:Key="ViewStyle1"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle1"> 
     <Setter Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

Entonces creo un DockPanel para cada estilo de vista, y siempre que los cambios en las propiedades ViewStyle, la vista apropiada pantallas.

Cuestiones relacionadas