2011-06-28 2 views
2

J'essaye de configurer une sous-classe de TextBox qui changera son style basé sur quelques choses différentes, et je me heurte à deux problèmes. Le premier déclencheur, celui de VisualBrush, se déclenche correctement mais n'écrit pas le texte dans la chaîne myName. J'ai essayé de faire de myName une propriété mais pour une raison quelconque, la méthode set renvoie une exception StackOverFlowException.Le déclencheur WPF/les liaisons ne fonctionnent pas

Le second problème concerne le DataTrigger, qui n'est pas déclenché même si isRequired est défini sur false.

Tout cela est dans un contrôle personnalisé qui hérite TextBox.

Voici mon XAML:

<TextBox.Style> 
    <Style TargetType="TextBox"> 
     <Style.Triggers> 
      <Trigger Property="Text" Value=""> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <VisualBrush Stretch="None"> 
          <VisualBrush.Visual> 
           <TextBlock Foreground="Gray" FontSize="24"> 
             <TextBlock.Text> 
              <Binding Path="myName" RelativeSource="{RelativeSource Self}" /> 
             </TextBlock.Text> 
           </TextBlock> 
          </VisualBrush.Visual> 
         </VisualBrush> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <DataTrigger Binding="{Binding Path=isRequired, Source={RelativeSource Self}}" Value="False"> 
       <Setter Property="Text" Value="100" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</TextBox.Style> 

CS:

public partial class SuperTB : TextBox 
{ 
    public String myName 
    { 
     get { return myName; } 
     set {} 
    } 

    DependencyProperty isRequiredProperty = DependencyProperty.Register("isRequired", typeof(Boolean), typeof(SuperTB)); 

    public Boolean isRequired 
    { 
     get { return (Boolean)GetValue(isRequiredProperty); } 
     set { SetValue(isRequiredProperty, value); } 
    } 

    public SuperTB() 
    { 
     InitializeComponent(); 
     myName = "Unicorns!"; 
    } 

} 

Ceci est le code qui StackOverflows il. également défaut au travail, mais pas une exception est:

public string myName = "Rainbows!"; 
+2

Veuillez également ajouter le code C#. –

+1

Veuillez utiliser uniquement la balise Visual Studio si votre question a réellement quelque chose à voir avec elle. (Le fait que vous ayez écrit votre code en lui-même n'entraîne pas que ** –

Répondre

5
public string myName  
{   
    get { return myName; }   
    set {}  
} 

que getter de la propriété est de retour lui-même, d'où le débordement de la pile.

et le compositeur ne fait rien, d'où le "ne pas travailler"

vous probablement veulent:

private string myName; // lower case! 
public string MyName // upper case! 
{   
    get { return myName; }   
    set { myName = value; }  
} 

ou même

public string myName { get; set; } 

et même alors ce encore gagné Ne fonctionne pas comme prévu, car rien ne déclenche de notifications de changement de propriété, donc personne ne remarquera que myName change.

+0

Je comprends maintenant le stackoverflow. Je l'ai modifié en tant que tel, et ai implémenté INotifyPropertyChanged et l'ai placé dans le setter pour myName mais la liaison ne fait toujours rien. [Voici mon nouveau code.] (Http://pastebin.com/w5P3mDjA) – humanstory

+0

Avez-vous des erreurs de liaison/avertissements qui sortent dans la fenêtre de sortie? Je verrais d'abord là. Je ne vois rien d'évident en ce moment ... –

+0

La sortie pertinente, que je ne peux pas comprendre, est: System.Windows.Data Erreur: 40: Erreur de chemin BindingExpression: propriété 'myName' introuvable sur 'objet '' 'RelativeSource' (HashCode = 4960368) '. BindingExpression: Path = myName; DataItem = 'RelativeSource' (HashCode = 4960368); l'élément cible est 'TextBlock' (Name = ''); La propriété target est 'Text' (type 'String') – humanstory

Questions connexes