2010-08-21 5 views
1

J'utilise silverlight pour Windows Phone et je souhaite lier la propriété IsEnabled d'un bouton à la présence ou non d'un texte dans un bloc de texte. En d'autres termes, je veux que mon bouton soit activé lorsque le texte du bloc de texte n'est pas vide et désactivé sinon.Liaison de la propriété IsEnabled à la présence de données dans un bloc de texte

Est-il possible de faire cela uniquement en XAML en utilisant Styles/Setters/Triggers ou tout autre mécanisme ou dois-je écrire un convertisseur?

PS: Je suis encore à apprendre silverlight, etc .. .NET

Répondre

6

Comme les types ne sont pas compatibles (et vous voulez généralement éviter code-behind/propriétés de dépendance) une « chaîne à convertisseur activé » est votre meilleur pari pour ce type de vérification simple.

Comme convertisseurs sont partagés autour de projets, et ne sont qu'une entrée mineure dans le XAML (et aucune modification de code-behind) vous ne devriez pas être inquiet sur l'utilisation de convertisseurs ... convertisseurs sont vos amis :)

Commencez à créer une bibliothèque de convertisseurs utiles car les mêmes types de problèmes se produisent à maintes reprises.

est ici un code minimal (pas de contrôle d'erreur) pour un convertisseur qui fait ce que vous vouliez:

using System; 
using System.Windows.Data; 

namespace LengthToEnabledTest 
{ 
    public class LengthToEnabledConverter : IValueConverter 
    { 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is string) 
      { 
       return (value as string).Length > 0; 
      } 
      throw new NotImplementedException(); 
     } 

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

     #endregion 
    } 
} 

et certains XAML de test correspondant (un simple panneau de pile avec 1 zone de texte et 1 bouton-poussoir):

<UserControl x:Class="TransitioningContentContolTest.LengthEnabledTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:converter="clr-namespace:LengthToEnabledTest" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <UserControl.Resources> 
     <converter:LengthToEnabledConverter x:Key="LengthToEnabledConverter"/> 
    </UserControl.Resources> 
    <StackPanel x:Name="LayoutRoot" Background="White"> 
     <TextBox x:Name="textBox" /> 
     <Button Content="Press me" Height="20" IsEnabled="{Binding Text, ElementName=textBox, Converter={StaticResource LengthToEnabledConverter}}"/> 
    </StackPanel> 
</UserControl> 
Questions connexes