2010-03-29 13 views
0

Je suis sur un rouleau aujourd'hui ...Définition d'une « propriété de dépendance » dans le code

Je le code suivant delaring une propriété de dépendance à l'intérieur d'une classe appelée ActionScreen:

#region Dependency Properties & Methods 

public string DescriptionHeader 
{ 
    get { return (string)GetValue(DescriptionHeaderProperty); } 
    set { SetValue(DescriptionHeaderProperty, value); } 
} 

// Using a DependencyProperty as the backing store for DescriptionHeader. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty DescriptionHeaderProperty = 
    DependencyProperty.Register("DescriptionHeader", typeof(string), typeof(ActionScreen), new UIPropertyMetadata("xxx")); 

#endregion 

Je lie à cette propriété dans mon Xaml comme si:

    <GridViewColumn DisplayMemberBinding="{Binding Description}" Header="{Binding DescriptionHeader}" Width="350" /> 

maintenant, je veux être en mesure de régler le paramètre de mon code derrière quand je reçois un événement - mais cela ne fonctionne pas:

public string DescColText { set { this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() { DescriptionHeader = value; })); } } 
+0

Qu'est-ce qui ne fonctionne pas à ce sujet? –

+0

Le texte n'apparaît pas sur ma page lorsque j'exécute DescColText = "blah"; –

Répondre

1

Salut résolu ce que je ne définissais pas le datacontext de la page.

Apparemment, je devais faire

this.DataContext = this; 
1

J'ai rencontré ce même problème. Il semble que la modification de la propriété de déférence ne déclenche pas une notification indiquant que la propriété a effectivement été modifiée. Vous devez faire ceci manuellement. Dans votre code derrière, implémentez l'interface INotifyPropertyChanged et dans votre enregistrement de propriété de dépendance, ajoutez le délégué PropertyChangedCallback. (Exemple)

public static readonly DependencyProperty DescriptionHeaderProperty = DependencyProperty.Register("DescriptionHeader", typeof(string), typeof(ActionScreen), new UIPropertyMetadata("xxx", new PropertyChangedCallback(DisplayTextChange))); 

    private static void DisplayTextChange(DependencyObject dpo, DependencyPropertyChangedEventArgs args) 
      { 
       ((WhatEverYourClassNameIs)dpo).NotifyPropertyChanged("DescriptionHeader"); 

      } 

Voici l'exemple de la mise en œuvre INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged; 

private void NotifyPropertyChanged(String info) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 

Cela devrait permettre à votre interface utilisateur de voir qu'un changement a eu lieu.

+0

Hmmm cela ressemble tellement à ce que je veux. Mon seul problème est maintenant que PropertyChanged est null, donc il ne déclenche jamais l'événement. Où dois-je ajouter le gestionnaire d'événements pour cela? –

+0

Vous n'ajouteriez pas de gestionnaire pour PropertyChanged. Vérifiez votre fenêtre de sortie. Assurez-vous qu'il n'y a pas d'erreurs de liaison de données (Ils commenceraient par "System.Windows.Data Error:") –

+0

Pas que je puisse voir ... –