2012-03-27 9 views
13

Me preguntaba si es posible ocultar un control en una vista si la propiedad a la que está vinculado el control no existe en el modelo de vista. Por ejemplo, si tengo el siguiente:MVVM: ocultar un control cuando la propiedad vinculada no está presente

<CheckBox Content="Quote" 
      IsChecked="{Binding Path=IsQuoted}" /> 

puedo detectar en XAML que la propiedad IsQuoted no existe en el modelo de vista, y simplemente ocultar el control en esa instancia.

Básicamente estoy creando un diálogo de asistente que se mueve a través de una colección de modelos de vista, mostrando la vista asociada para cada uno. Para algunos de los modelos de vista en la colección, la propiedad "IsQuoted" estará presente, y para algunos no.

Me gustaría tener una casilla de verificación fuera de estas vistas que se muestra cuando el modelo de vista actual tiene la propiedad y se oculta cuando el modelo de vista no. Todos los modelos de vista se derivan de una clase base común, pero prefiero no saturar la base agregando una propiedad "Mostrar cita", etc.

¿Pensamientos? Y, gracias de antemano ...

Respuesta

36

Maneje el caso donde el valor está presente mediante el uso de un convertidor que siempre devuelve Visibilidad.Visible. Maneje el caso donde el valor no está presente especificando un valor de retorno. Cuando la propiedad no está presente, el enlace falla y recibe el valor de retorno.

<Page.DataContext> 
    <Samples:OptionalPropertyViewModel/> 
</Page.DataContext> 
<Grid> 
    <Grid.Resources> 
     <Samples:AlwaysVisibleConverter x:Key="AlwaysVisibleConverter" /> 
    </Grid.Resources> 
    <CheckBox 
     Content="Is quoted" 
     IsChecked="{Binding IsQuoted}" 
     Visibility="{Binding IsQuoted, 
        Converter={StaticResource AlwaysVisibleConverter}, 
        FallbackValue=Collapsed}" 
     /> 
</Grid> 

public class OptionalPropertyViewModel 
{ 
    public bool IsQuoted { get; set; } 
} 

public class AlwaysVisibleConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

    public object Convert(object value, 
          Type targetType, object parameter, CultureInfo culture) 
    { 
     return Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 
+2

Cool. He estado usando WPF durante cuatro años y nunca me di cuenta de la propiedad FallbackValue (o lo hice y simplemente no presté atención en ese momento, es difícil de decir). Esto podría ser útil. – MetalMikester

+0

Si quiere ser más explícito, puede buscar DependencyProperty.UnsetValue http://msdn.microsoft.com/en-us/library/system.windows.dependenproperty.unsetvalue%28v=vs.110%29. aspx –

Cuestiones relacionadas