2009-02-20 7 views
4

Je suis relativement nouveau dans DataBinding et je ne fais que lire. Ce que je veux faire est la suivante:Lier StackPanel.Visibilité à la propriété Visibility de ses enfants

J'ai un StackPanel avec un certain nombre de contrôles enfants:

 <StackPanel Orientation="Horizontal"> 
      <TextBox x:Name="textbox1" Width="100">1</TextBox> 
      <TextBox x:Name="textbox2" Width="100">2</TextBox> 
      <TextBox x:Name="textbox3" Width="100">3</TextBox> 
     </StackPanel> 

La propriété de visibilité des zones de texte peut être modifié par le code. Maintenant, si toutes les zones de texte sont définies sur Visibilité = Réduit, je veux également que StackPanel.Visibility soit défini sur Réduit, mais si une ou plusieurs zones de texte sont affichées (Visibilité = Visible), StackPanel.Visibility doit également être défini sur Visible. Est-ce que cela peut être réalisé avec un simple DataBinding ou dois-je implémenter cette fonctionnalité dans le code C#?

Répondre

5

Avez-vous envisagé de définir la visibilité des zones de texte sur Hidden? Cela va "cacher" l'espace qui est assigné pour les TextBoxes. En supposant qu'ils ne sont pas d'autres contrôles dans le StackPanel, alors il ne sera pas visible.

Bien sûr, cette solution peut faire des suppositions naïves sur votre implémentation.

Si vous avez besoin du scénario plus complexe, je tenterais les éléments suivants: Note: Ceci est psuedocode - ne peut pas compiler ..

1) Utilisez un MultiBinding

<StackPanel> 
    <StackPanel.Visibility Converter={StaticResource visibilityConverter}> 
    <MultiBinding.Bindings> 
     <Binding ElementName="textBox1" Path="Visibility" /> 
     <Binding ElementName="textBox2" Path="Visibility" /> 
     <Binding ElementName="textBox3" Path="Visibility" /> 
    </MultiBinding.Bindings> 
    </StackPanel.Visibility> 
</StackPanel> 

2) Déclarer la convertisseur

<Window.Resources> 
    <local:VisibilityConverter x:Key="visibilityConverter" /> 
</Window.Resources> 

3) Définir le convertisseur

public class VisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
    Visibility text1Vis = (Visibility)values[0]; 
    Visibility text2Vis = (Visibility)values[1]; 
    Visibility text3Vis = (Visibility)values[2]; 

    if (text1Vis == text2Vis == text3Vis == Visibility.Collapsed) 
     return Visibility.Collapsed; 

    return Visibility.Visible; 
    } 
} 
+2

petite erreur: Converter = {StaticResource visibilityConverter} devrait aller MultiBinding.Bindings au lieu de visibilité –

+1

Erreurs de syntaxe dans XAML. Le convertisseur passe à l'élément MultiBinding. Remplacez par . (Vous pouvez avoir une syntaxe d'élément de propriété sans élément parent ci-dessus). Besoin de compiler le code avant de le poster. –

+0

@SeanSexton, j'ai noté dans ma réponse que je donnais psuedocode. J'ai effectivement posté 9 minutes après que la question originale ait été posée, donc je n'ai pas eu l'occasion de lancer un projet complet et de tester le code. La beauté de ce site est que vous pouvez sauter dans un edit ma réponse si. :-) –

7

Je n'arrive pas à trouver un moyen de le faire directement via la liaison de données.

Personnellement, j'aurais un modèle de vue derrière la vue, et définirais les vues DataContext au modèle de vue.

Dans le modèle de vue, j'aurais alors une propriété indiquant à la vue si toutes les zones de texte sont réduites. Cette propriété serait définie par code. Puis liez la visibilité de la pile à cette propriété.

(La propriété doit être soit une propriété de dépendance, ou le modèle de vue doit mettre en œuvre INotifyPropertyChanged pour la vue de mettre à jour automatiquement)

Questions connexes