35 votes

Quand utiliser une propriété de dépendance WPF par rapport à INotifyPropertyChanged

Les gens ont-ils des indications sur le moment où une simple propriété .NET qui déclenche INotifyPropertyChanged.PropertyChanged est suffisante dans un modèle de vue? Alors, quand voulez-vous passer à une propriété de dépendance complète? Ou les PDD sont-ils principalement destinés aux vues?

53voto

lukas Points 7789

Il existe quelques approches:

1. La propriété de dépendance

Lorsque vous utilisez la propriété de dépendance, il fait le plus de sens à des éléments-les classes qui ont un aspect visuel (UIElements).

Pour:

  • WPF ne la logique des choses pour vous
  • Certains mécanismes, comme l'animation d'utiliser uniquement la propriété de dépendance
  • 'Ajustements' ViewModel style

Inconvénients:

  • Vous devez dériver la forme DependencyObject
  • Un peu gênant pour des choses simples

Exemple:

public static class StoryBoardHelper
{
    public static DependencyObject GetTarget(Timeline timeline)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        return timeline.GetValue(TargetProperty) as DependencyObject;
    }

    public static void SetTarget(Timeline timeline, DependencyObject value)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        timeline.SetValue(TargetProperty, value);
    }

    public static readonly DependencyProperty TargetProperty =
            DependencyProperty.RegisterAttached(
                    "Target",
                    typeof(DependencyObject),
                    typeof(Timeline),
                    new PropertyMetadata(null, OnTargetPropertyChanged));

    private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Storyboard.SetTarget(d as Timeline, e.NewValue as DependencyObject);
    }
}

2. Le Système.ComponentModel.INotifyPropertyChanged

Généralement, lors de la création d'un objet de données, vous devez utiliser cette approche. Il est simple et soigné, solution pour Données-comme des choses.

Avantages et Inconvénients - complémentaire à 1. Vous avez besoin pour mettre en œuvre un seul événement (PropertyChanged).

Exemple:

public class Student : INotifyPropertyChanged 
{ 
   public event PropertyChangedEventHandler PropertyChanged; 
   public void OnPropertyChanged(PropertyChangedEventArgs e) 
   { 
       if (PropertyChanged != null) 
          PropertyChanged(this, e); 
   } 
}

private string name; 
public string Name; 
{ 
    get { return name; } 
    set { 
           name = value; 
           OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
        } 
} 

3.PropertyNameChangé

La hausse d'un événement pour chaque propriété dont le nom est spécifié(f.e. NameChanged). L'événement doit avoir ce nom, et c'est à vous de gérer et monter eux. Approche similaire 2.

4. Obtenir la liaison

À l'aide de l' FrameworkElement.GetBindingExpression() vous pouvez obtenir le BindingExpressionobjet et appelez - BindingExpression.UpdateTarget() pour se rafraîchir.

La première et la seconde sont les plus probables en fonction de ce qui est votre but.

Dans l'ensemble, c'est Visual vs Données.

14voto

abhishek Points 1746

Pour autant que je sache, DependencyProperty n'est requis que lorsque vous avez besoin

  1. Héritage PropertyValue
  2. vous devez autoriser la définition de la propriété dans les paramètres de style
  3. Utiliser l'animation pour la propriété

etc.

Ces fonctionnalités ne seront pas disponibles avec des propriétés normales.

4voto

CodeMnke Points 1

DependencyProperty est requis si vous souhaitez autoriser la définition d'une liaison sur la propriété. Habituellement, c'est pour les UIElement s personnalisés que vous créez. Vous souhaitez permettre aux utilisateurs de lier des données à votre UIElement s.

 <local:MyUIElement MyProperty={Binding Path=SomethingToBindTo} />
 

Pour ce faire, MyProperty est une propriété de dépendance

1voto

Ia McInnes Points 11

Le principal problème que je vois avec INotifyPropertyChanged est que si votre modèle d'affichage est complexe contenant de nombreux types imbriqués, il semble que vous devez faire bouillonner l'événement PropertyChanged dans la hiérarchie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X