web-dev-qa-db-fra.com

WPF - Lier la visibilité de UserControl à une propriété

J'ai un ListView lié à ObservableCollection. Les données sont chargées à partir d'Internet, puis ajoutées à la collection. Le téléchargement prend quelques secondes et je veux indiquer à l'utilisateur que les données sont en cours de chargement. 

J'ai créé un UserControl qui indique une activité. Je l'ai placé à l'intérieur de ControlTemplate.

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

Je souhaiterais lier Visibility of ActivityIndicatorControl à une propriété, disons bool IsLoading et définissez-la sur Visible/Collapsed en conséquence.

Merci!

15
Martin

Je recommanderais d'utiliser un IValueConverter pour accepter votre valeur booléenne et renvoyer un membre de l'énumération Visibility.

Voici un bon exemple: http://jeffhandley.com/archive/2008/10/27/binding-converters---visibilityconverter.aspx

Le XAML ressemblerait à ceci:

Tout d’abord, vous définissez une ressource pour le convertisseur (placez-la dans un dictionnaire de ressources):

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

Et puis changez votre modèle comme ceci:

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

Utiliser le convertisseur intégré de .NET

.NET 3 a un BooleanToVisibilityConverter intégré .

(Remarque: Peut ne pas être disponible sur toutes les plateformes, ex: mobile)

Tout d'abord l'ajouter à vos ressources

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

Ensuite, utilisez-le sur un élément

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

Inverser

Comment puis-je inverser BooleanToVisibilityConverter?

Si vous souhaitez inverser le convertisseur (ex: masquer l'élément lorsque votre propriété est true), cette réponse a une implémentation personnalisée de IValueConverter qui la prend en charge via XAML.

<Application.Resources>
    <app:BooleanToVisibilityConverter 
        x:Key="BooleanToVisibilityConverter" 
        True="Collapsed" 
        False="Visible" />
</Application.Resources>
0
Walter Stabosz