2012-05-15 28 views
15

Tengo un ListView vinculado a ObservableCollection. Los datos se cargan de Internet y luego se agregan a la colección. La descarga demora unos segundos y quiero indicar al usuario que los datos se están cargando.WPF - Vincular visibilidad de control de usuario a una propiedad

Creé un UserControl que indica actividad. Lo coloqué dentro de ControlTemplate.

<ControlTemplate x:Key="ListViewControlTemplate1" TargetType="{x:Type ListView}"> 
    <Grid> 
     <local:ActivityIndicatorControl 
      HorizontalAlignment="Center" 
      Height="Auto" 
      Margin="0" 
      VerticalAlignment="Center"/> 
    </Grid> 
</ControlTemplate> 

quisiera unirse Visibilidad de ActivityIndicatorControl a una propiedad, digamos bool IsLoading y la pusieron en Visible/colapsado correspondientemente.

Gracias!

Respuesta

28

Recomendaría usar un IValueConverter para aceptar su booleano y devolver un miembro de la enumeración de Visibilidad.

Aquí es un buen ejemplo de uno: http://jeffhandley.com/archive/2008/10/27/binding-converters---visibilityconverter.aspx

El XAML se vería así:

En primer lugar definir un recurso para el convertidor (poner esto en un diccionario de recursos):

<local:BooleanToVisibilityConverter x:Key="myBoolToVisibilityConverter" /> 

Y a continuación, cambiar la plantilla de esta manera:

<ControlTemplate x:Key="ListViewControlTemplate1" TargetType="{x:Type ListView}"> 
    <Grid Visibility="{Binding IsLoading, Converter={StaticResource myBoolToVisibilityConverter}}> 
     <local:ActivityIndicatorControl 
      HorizontalAlignment="Center" 
      Height="Auto" 
      Margin="0" 
      VerticalAlignment="Center"/> 
    </Grid> 
</ControlTemplate> 
+0

Gracias, exactamente lo que estaba buscando ! Además, ¿UserControl hereda DataContext de Grid? ¿Sería posible crear el enlace en el UserControl en sí? – Martin

+1

Sí, el UserControl tendría el mismo DataContext que la Grilla. Debido a esto, puede poner la visibilidad vinculante en UserControl sin problema. – davisoa

+0

Una pequeña nota: cambie BooleanToVisibiltyConverter a BooleanToVisibilityConverter (agregue la "i" que falta) y se verá así: Kaitnieks

0

Utilice .NET incorporado en el convertidor

.NET 3 tiene un built in BooleanToVisibilityConverter.

(Nota: Puede no estar disponible en todas las plataformas, ex: móvil)

añadirla primero a sus recursos

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="bool2vis"></BooleanToVisibilityConverter> 
</UserControl.Resources> 

luego usarlo en un elemento

<Label Visibility="{Binding IsSomeProperty, Converter={StaticResource bool2vis}}" /> 

inversor

How do I invert BooleanToVisibilityConverter?

Si desea invertir el convertidor (por ejemplo: ocultar el elemento cuando su propiedad es verdadera), esta respuesta tiene una implementación personalizada de IValueConverter que admite que a través de XAML

<Application.Resources> 
    <app:BooleanToVisibilityConverter 
     x:Key="BooleanToVisibilityConverter" 
     True="Collapsed" 
     False="Visible" /> 
</Application.Resources> 
Cuestiones relacionadas