2011-03-28 4 views
2

J'ai un problème avec la mise à jour de liaison lorsque la propriété de liaison est modifiée. Regardez le code ci-dessous. Je vais expliquer mon problème dans l'exemple suivant.Problème de mise à jour de liaison

public class SettingsControl : INotifyPropertyChanged 
    { 

     string _value = "test"; 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

     public SettingsControl() { } 


    public string Value 
     { 
      get { return _value; } 
      set { _value = value; OnPropertyChanged("Value"); } 
     } 
    } 

<local:SettingsControl x:Key="Settings"></local:SettingsControl> 

<TextBox Height="72" Text="{Binding Value, Mode=TwoWay, Source={StaticResource Settings} }"/> 
<TextBlock Text="{Binding Value, Mode=OneWay, Source={StaticResource Settings} }" VerticalAlignment="Top" Width="135" /> 
<Button Height="100" Click="button1_Click" /> 

et code derrière:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     SettingsControl settings = new SettingsControl(); 
     settings.Value = "new value"; 
    } 

Maintenant, quand je change le texte dans TextBox tout fonctionne très bien. Le nouveau texte est affiché en TextBlock. Mais si je mets un nouveau texte dans le code settings.Value rien ne se passe. Ce que je suppose à faire pour changer settings.Value dans le code et affecter TextProperty en TextBlock.

EDIT: Solution ci-dessous pour ceux qui avaient comme moi le même problème:

SettingsControl settings = (SettingsControl)this.Resources["Settings"]; 
    settings.Value = "new value"; 

Répondre

5

Dans votre code derrière, vous définissez la valeur sur une nouvelle instance, pas sur l'instance utilisée.

Essayez de changer le code derrière:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    // Set the Value on "this" 
    this.Value = "new value"; 
} 

Cela étant dit, les propriétés sur un « contrôle » sont généralement traitées par une propriété de dépendance faisant, non par INotifyPropertyChanged. Cela leur permet d'être définis et utilisés correctement dans XAML et de participer pleinement à la liaison dans d'autres scénarios.

+0

Mais je ne peux pas atteindre 'Value' via' this.Value'. Je reçois une erreur "'binding.MainPage' ne contient pas de définition pour 'Value' ...". Merci pour la suggestion, je vais regarder plus près de la propriété de dépendance. – Maku

+1

@Maku: Dans ce cas, vous devez obtenir la bonne référence au contrôle - ne pas créer une nouvelle instance, mais plutôt utiliser "this.mySettingsControl.Value" –

+0

Ok, maintenant je l'ai! Je vous remercie! – Maku

0

Vous devriez essayer de faire Mode = TwoWay ;-)

+0

Dans cet exemple particulier, nous pouvons le faire (Mode = TwoWay et dans le code TextBlock.Text = "nouvelle valeur"). Je cherchais une solution générale. Merci à Reed Copsey problème est résolu. – Maku