2009-05-28 6 views
2

Pour une raison quelconque, je suis vraiment aux prises avec cela. Je suis nouveau à wpf et je n'arrive pas à trouver l'information dont j'ai besoin pour comprendre ce problème simple. Je tente de lier une zone de texte à une chaîne, la sortie de l'activité de programmes. J'ai créé une propriété pour la chaîne, mais lorsque la propriété change, la zone de texte ne le fait pas. J'ai eu ce problème avec une liste, mais j'ai créé un répartiteur qui actualise la liste.Les liens de données ne semblent pas se rafraîchir

Je dois manquer un point important, car je pensais que l'un des avantages de l'utilisation de wpf n'était pas de devoir mettre à jour les contrôles manuellement. J'espère que quelqu'un peut m'envoyer dans la bonne direction.

dans windowMain.xaml.cs

private string debugLogText = "initial value"; 

public String debugLog { 
    get { return debugLogText; } 
    set { debugLogText = value; } 
} 

dans windowMain.xaml

x:Name="wndowMain" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
DataContext="{Binding RelativeSource={RelativeSource Self}}" 

<TextBox Name="txtDebug" Text="{Binding ElementName=wndowMain, Path=debugLog}" /> 

Répondre

5

Mettre en œuvre INotifyPropertyChanged de votre classe. Si vous avez plusieurs classes qui ont besoin de cette interface, je trouve souvent utile d'utiliser une classe de base comme celle-ci.

public abstract class ObservableObject : INotifyPropertyChanged 
{ 

    protected ObservableObject() 
    { 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) { 
      handler(this, e); 
     } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

} 

Il vous suffit de vous assurer que vous soulevez l'événement PropertyChanged lors de chaque changement de valeur de la propriété. Par exemple:

public class Person : ObservableObject { 

    private string name; 

    public string Name { 
     get { 
       return name; 
     } 
     set { 
       if (value != name) { 
        name = value; 
        OnPropertyChanged("Name"); 
       } 
     } 
    } 

} 
+1

+1 pour la classe ObservableObject! –

+0

Pourquoi ce travail supplémentaire avec le gestionnaire var = PropertyChanged ;? Sécurité du filetage? –

+0

Ouais c'est juste une habitude que j'ai ramassée. Même s'il est assez improbable que vous souleviez/vous abonniez à cela à partir de différents sujets, il n'y a pas grand mal à cela et c'est devenu quelque chose d'un réflexe. D'autres ont montré que vous pouvez éliminer la vérification en initialisant l'événement comme: événement public PropertyChangedEventHandler PropertyChanged = delegate {}; Mais ce n'est pas seulement lent, il se sent piraté. :) – Josh

Questions connexes