J'ai un modèle qui a un nombre d'attributs qui peut être ou ne pas être nul, selon que les données sont disponibles pour ces attributs spécifiques sur un serveur distant.Accès et modification des éléments xaml avec Reflection en C#
Je construis une application Windows Phone simple qui donne des versions plus facilement accessibles de ces informations sur un téléphone mobile. J'ai trouvé que dans le cas où les propriétés du modèle ci-dessus ne sont pas définies, la valeur n'apparaît pas (affiche un blanc), mais l'étiquette apparaît toujours. Après avoir considéré un certain nombre de différentes alternatives pour cela (y compris des quantités massives d'instructions if, ugh), j'ai décidé que si je définissais le nom d'attributs spécifiques dans le xaml pour correspondre aux propriétés du modèle de données que je cherchais À, je puis en temps réel avoir le système analyser les propriétés du modèle de données, et les éléments de mon xaml. Si une propriété de mon xaml correspondait au nom de la propriété dans mon modèle et que le modèle était null, je pourrais réduire la visibilité. Si le modèle n'était pas nul, rendez-le visible. Ainsi, je pourrais avoir une solution propre et dynamique qui ne montrerait que les données réellement disponibles.
est ici le code
PropertyInfo[] properties = data.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
FieldInfo view = this.GetType().GetField(property.Name);
if (view != null)
{
if (property.GetValue(data, null) == null)
{
object aView = view.GetValue(this);
aView.GetType().GetProperty("Visibility").SetValue(aView, "Collapsed", null);
}
else
{
object aView = view.GetValue(this);
aView.GetType().GetProperty("Visibility").SetValue(aView, "Visible", null);
}
}
}
Malheureusement, je frappe un accroc. Je n'arrive pas à comprendre comment accéder aux éléments xaml. J'ai essayé d'utiliser
this.GetType().GetProperties()
this.GetType().GetFields()
this.GetType().GetMembers()
Pour trouver les éléments que je suis à la recherche, mais ils ne figurent pas dans l'un de ces. Y a-t-il quelque chose qui me manque?
Y a-t-il une meilleure façon de faire cela qui soit plus belle?
Merci d'avance pour votre aide.
Je pense que vous allez à ce sujet dans le mauvais sens. Vous devez suivre le modèle MVVM et lier la visibilité à une propriété de votre modèle qui détermine si vos données sont disponibles. –
@JeffMercado Vous n'avez pas besoin de suivre le modèle MVVM! Si c'est une application simple, un peu de code-behind ne fera pas de mal. – ColinE
Si vous avez une suggestion pour ce faire, je suis tout ouïe! Idéalement, le StackPanel qui contient tous les éléments liés à cet élément serait visible/effondré –