/ / Les contrôles utilisateur génériques et les propriétés de dépendance génériques sont-ils possibles? - wpf, génériques, dependency-properties, initializecomponent

Des UserControls génériques et des propriétés de dépendance génériques sont-ils possibles? - wpf, génériques, dependency-properties, initializecomponent

J'ai une classe générique abstraite qui définit unPropriété de dépendance générique dont le type doit être défini par les classes de sous-classes. Cette propriété n'est en quelque sorte pas reconnue comme une propriété de dépendance, de sorte que je reçois un message d'erreur lors de l'exécution lors de la liaison à cette propriété. De plus, pendant la compilation, le constructeur ne peut pas appeler InitializeComponent. Pourquoi donc?

La classe abstraite générique MyClass:

abstract public class MyClass<T,U> : UserControl {
protected MyClass() {
InitializeComponent(); // Here is one error: Cannot be found
}

abstract protected U ListSource;

private static void DPChanged
(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var myClassObj = (MyClass) d;
myClassObj.DataContext = myClassObj.ListSource;
}

// Causes a binding error at runtime => DP (of the concrete subclass)
// is not recognized as a dependency property
public static readonly DependencyProperty DPProperty =
DependencyProperty.Register(
"DP",
typeof(T),
typeof(MyClass),
new PropertyMetadata(null, DPChanged));

public T DP {
get { return (T) GetValue(DPProperty); }
set { SetValue(DPProperty, value); }
}
}

Le XAML correspondant:

<UserControl x:Class="Path.of.Namespace.MyClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ListView>
<!-- Some stuff for the list view - used for all subclasses -->
</ListView>
</UserControl>

Une sous-classe en béton MySubClass:

public partial class MySubClass : MyClass<ClassWithAList, List<int>> {
public MySubClass() {
InitializeComponent(); // Another error: Cannot be found
}

protected List<int> ListSource {
get { return new List<int>(); } // Just a dummy value

}
}

Le XAML correspondant:

<local:MySubClass xmlns:local="Path.of.Namespace.MySubClass" />

P.S. Je ne suis pas sûr que le partial les choses sont faites correctement - R # suggère de supprimer ces mots-clés.

Réponses:

1 pour la réponse № 1

Je pense qu'il y a plusieurs problèmes avec votre code, mais d'abord, laissez-moi vous expliquer partial dans ce contexte:

partial est utilisé pour déclarer une classe dans des fichiers séparés. Comme visual studio crée un MySubClass.g.cs avec un partial class MySubClass (d'ailleurs, c'est là que la méthode InitializeComponent est déclaré) de votre MySubClass.xaml vous "avez deux fois cette déclaration de classe et donc pour que cela soit compilé, vous aurez besoin de la partial mot-clé.

Maintenant pour le reste: XAML et les génériques ne font pas bien ensemble, ce qui signifie: pas du tout. votre "XAML correspondant" déclare un MyClass. Mais un MyClass sans paramètres génériques n’existe pas. Vous pouvez à ce stade changer x:Class="Path.of.Namespace.MyClass" à x:Class="Path.of.Namespace.MySubClass", Cela devrait fonctionner.

mais maintenant la chose suivante est: comment voulez-vous accéder à cette propriété de dépendance dans xaml? c'est un membre statique dans un type générique, vous devez donc le spécifier comme ceci dans le code: MyClass<ClassWithAList, List<int>>.DPProperty. Le problème est encore: vous ne pouvez pas le faire en xaml

pour résoudre votre problème, il peut être judicieux de nous dire ce que vous voulez accomplir


0 pour la réponse № 2

Je pense que le problème pourrait être que vous écrivez typeof (MyClass), et devriez être typeof(MyClass<T,U>).