2010-06-05 4 views
4

J'ai un contrôle WPF complexe qui, pour certaines raisons (performances) n'utilise pas de propriétés de dépendance mais de simples propriétés C# (au moins au niveau supérieur, elles sont exposées en tant que propriétés).WPF Exposition d'une propriété calculée pour la liaison (comme DependencyProperty)

L'objectif est de permettre de se lier à certaines de ces propriétés de haut niveau -.> Je suppose que je devrais les déclarer comme DPs (droit ou est-il un autre moyen d'y parvenir?)

I commencé à lire sur MSDN à propos DependencyProperties et DependencyObjects et a trouvé un exemple:

public class MyStateControl : ButtonBase 
{ 
    public MyStateControl() : base() { } 
    public Boolean State 
    { 
    get { return (Boolean)this.GetValue(StateProperty); } 
    set { this.SetValue(StateProperty, value); } 
    } 
    public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false)); 
} 

Si je ne me trompe pas - ce code impose la propriété à sauvegarder par DependencyProperty dont il limite à être une propriété simple avec un magasin (de point de vue fonctionnel, pas techniquement) au lieu de pouvoir calculer la valeur de la propriété à chaque fois que getter est appelé et la définition d'autres propriétés/champs à chaque fois que setter est appelé.

Que puis-je faire à ce sujet? Y a-t-il un moyen de faire que ces deux mondes se rencontrent à un moment donné? // edit Je suppose que je dois vous en dire un peu plus sur ce que je veux faire et quelles sont mes limites. Donc:

J'ai TabControl qui est lié à une collection d'objets ViewModel (j'utilise le modèle MVVM). Chaque onglet est destiné à être un éditeur pour un objet de cette collection. Les objets peuvent être de différents types, donc j'ai plusieurs définitions chacune avec une propriété DataType différente. Maintenant, j'ai ce contrôle WPF complexe que je veux utiliser dans le cadre de l'un de ces DataTemplates. Si j'utilise TextBox habituel je peux simplement lier à sa propriété Text, mais je ne peux pas faire la même chose avec la propriété Text de ce contrôle personnalisé simplement parce que sa propriété Text n'est pas une propriété de dépendance. Dans ce scénario, j'ai:

  • pas d'accès direct au contrôle lui-même ni à ses événements
  • pas de code derrière le fichier que je peux utiliser pour faire ce genre de chose

je peux voir Cependant, une solution sale -

  1. Dans la classe Window, je devrais souscrire à l'événement CollectionChanged de la collection liée à TabControl.
  2. Chaque fois qu'un élément est ajouté à cette utilisation de collecte ItemContainerGenerator pour obtenir une copie de je suppose TabItem et l'utiliser pour trouver la bonne copie du « contrôle complexe »
  3. articles Regiter gestionnaires aux événements «contrôles complexes pour faire le travail

Ceci est faux parce que:

  • c'est agains MVVM - Je dois jouer avec contrôle onglet pour faire le travail au lieu de le faire dans la classe ViewModel
  • ce couple dans un un Je voulais que la vue et viewmodel

Répondre

0

Il me semble que vous avez prises avec un contrôle utilisateur WPF qui a été construit par quelqu'un qui n'a pas l'intention d'être utilisé avec la liaison de données. Je suppose que c'est pour l'une des deux raisons suivantes: a) il y a une raison logique pour laquelle vous ne devriez pas être capable de lier cette propriété, ou b) l'auteur original de ce contrôle ne savait pas ce qu'il faisait. Vous n'avez pas fourni assez d'informations pour que je sache laquelle de ces deux conditions est celle dans laquelle vous travaillez vraiment.

Mais en général, la raison pour laquelle vous ne pouvez pas exposer les propriétés calculées pour la liaison est que les propriétés calculées n'ont généralement pas de setter. Cela n'a aucun sens de définir une propriété dont la valeur est calculée. S'il existe d'autres propriétés dont les valeurs doivent être mises à jour lorsque celle-ci change, la bonne approche (ou au moins celle qui correspond à la conception des propriétés de dépendance) est de gérer ces mises à jour dans la fonction de rappel de la propriété de dépendance. est un peu à quoi sert la fonction de rappel.

+0

Vous avez parfaitement raison. La propriété que j'essayais de lier n'était pas faite à cette fin. J'ai trouvé une autre propriété qui fait essentiellement la même chose et c'est un DP et je peux me lier à lui. Malheureusement, la liaison ne fonctionne pas du tout, mais c'est un autre jour passé sur le débogage et une autre histoire .. (Je vais probablement poser des questions à ce sujet mais pas ici) – kubal5003

5

Je pense que vous mélangez les propriétés de dépendance et l'implémentation de INotifyPropertyChanged sur vos classes.Vous n'avez pas besoin que votre propriété soit une propriété de dépendance, vous avez juste besoin de votre classe pour implémenter INotifyPropertyChanged et appeler OnPropertyChanged chaque fois que l'état de votre objet change d'une manière qui affecterait la valeur que vous souhaitez exposer à la liaison . Donc, disons que vous avez une propriété "Somme" à laquelle vous voulez vous lier. La propriété Sum simple ajoute deux autres propriétés (ou des champs, ou peu importe) ensemble. Lorsque survient un événement affectant le calcul de la somme, vous devez indiquer que la valeur Sum a été modifiée, de sorte que tous les contrôles liés à Sum sont mis à jour.

public int Sum 
{ 
    get{ return Value1 + Value2 }; 
} 

public int Value1 
{ 
    set 
    { 
     //changing this affects "Sum", so I need to notify that the binding should update 
     _value1 = value; 
     OnPropertyChanged("Sum"); 
    } 
} 

public int Value2 
{ 
    set 
    { 
     //Changing this affects "Sum", so I need to notify that the binding should update 
     _value2 = value; 
     OnPropertyChanged("Sum"); 
    } 
} 
+0

Merci pour votre réponse. J'ai écrit quelques informations sur ma situation. (modifié le post ci-dessus) – kubal5003

+3

Existe-t-il une recommandation de meilleure pratique pour le mélange INotifyPropertyChanged et DependencyProperties dans la même classe? – BrainSlugs83

Questions connexes