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?
Réponses
Trop de publicités?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 (UIElement
s).
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 BindingExpression
objet
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.
Pour autant que je sache, DependencyProperty
n'est requis que lorsque vous avez besoin
- Héritage PropertyValue
- vous devez autoriser la définition de la propriété dans les paramètres de style
- Utiliser l'animation pour la propriété
etc.
Ces fonctionnalités ne seront pas disponibles avec des propriétés normales.
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