En utilisant WPF, j'ai remarqué que lorsque j'ajoute un contrôle à un fichier XAML, le constructeur par défaut est appelé.
Existe-t-il un moyen d'appeler un constructeur paramétré ?
En utilisant WPF, j'ai remarqué que lorsque j'ajoute un contrôle à un fichier XAML, le constructeur par défaut est appelé.
Existe-t-il un moyen d'appeler un constructeur paramétré ?
Pour tous ceux qui sont venus ici en cherchant exactement cette réponse, je vais vous faire gagner du temps car vous allez trouver ce post à la suite : stackoverflow.com/questions/14347181/
"En fait, aucun compilateur actuel (WPF, SL, WinRT) ne le prend en charge" - Duncan Matheson. Lié par le commentaire de Kevek, devrait être dans la réponse.
L'un des principes directeurs des objets conviviaux XAML est qu'ils doivent être entièrement utilisables avec un constructeur par défaut, c'est-à-dire qu'il n'y a aucun comportement qui n'est accessible qu'en utilisant un constructeur autre que celui par défaut. Pour s'adapter à la nature déclarative de XAML, les paramètres des objets sont spécifiés via des setters de propriété. Il existe également une convention selon laquelle l'ordre dans lequel les propriétés sont définies dans XAML ne doit pas être important.
Il se peut toutefois que vous ayez des considérations particulières qui sont importantes pour votre mise en œuvre mais qui vont à l'encontre de la convention :
StreamSource
y UriSource
d'une image.Afin de faciliter le traitement de ces cas, la fonction ISupportInitialize
est fournie. Lorsqu'un objet est lu et créé à partir de XAML (c'est-à-dire qu'il est analysé), les objets mettant en œuvre l'option ISupportInitialize
seront traitées de manière particulière :
BeginInit()
sera appelé.EndInit()
s'appelle.En suivant les appels à BeginInit()
y EndInit()
vous pouvez gérer toutes les règles que vous souhaitez imposer, y compris l'obligation de définir certaines propriétés. C'est de cette manière que vous devez gérer les paramètres de création, et non en exigeant des arguments de constructeur.
Notez que ISupportInitializeNotification
est également fournie, qui étend l'interface ci-dessus en ajoutant une fonction IsInitialized
la propriété et Initialized
événement. Je recommande d'utiliser la version étendue.
Oui, vous pouvez le faire par le ObjectDataProvider
. Il vous permet d'appeler un constructeur non par défaut, par exemple :
<Grid>
<Grid.Resources>
<ObjectDataProvider x:Key="myDataSource"
ObjectType="{x:Type local:Person}">
<ObjectDataProvider.ConstructorParameters>
<system:String>Joe</system:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</Grid.Resources>
<Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label>
</Grid>
en supposant que cette personne est
public class Person
{
public Person(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
}
Malheureusement, vous ne pouvez pas lier le ConstructorParameters
. Voir quelques solutions de contournement ici .
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.
0 votes
Jetez un coup d'œil à ma question stackoverflow.com/questions/15735830/