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 -
- Dans la classe Window, je devrais souscrire à l'événement CollectionChanged de la collection liée à TabControl.
- 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 »
- 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
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