2010-10-25 8 views
10

Je me suis retrouvé à utiliser beaucoup de liaisons individuelles à ma classe App pour le stockage des propriétés, ce qui m'a conduit à une exception stackoverflow non traçable. J'ai maintenant décidé de déplacer ces propriétés vers une classe ApplicationInfo singleton séparée, mais j'ai quelques problèmes avec la liaison.wpf - liaison datacontext aux propriétés statiques de la classe singleton

Si je me lie directement à une propriété membre de ma classe, telle que CurrentUser, cela fonctionne correctement. Mais quand j'essaye de lier un datacontext à cette classe, j'obtiens des erreurs de compilateur et je suis sûr qu'il y a une modification simple que j'ai oubliée. J'ai créé un singleton hors de cette classe mais maintenant quand j'essaie de compiler, j'obtiens l'erreur "Erreur de construction inconnue - la clé ne peut pas être nulle" et elle pointe vers ma liaison Datacontext pour le message d'erreur.

Voilà ma classe:

public class ApplicationInfo 
{ 
    private ApplicationInfo() 
    { 

    } 
    private static ApplicationInfo _Current = new ApplicationInfo(); 
    public static ApplicationInfo Current 
    { 
     get { return _Current; }   
    } 

    #region Application Info Properties 
    private static Assembly _ExecutingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //holds a copy of this app's assembly info 
    public static String ApplicationName 
    { 
     get { return _ExecutingAssembly.ManifestModule.Name; } 
    } 
    public static String ApplicationNameTrimmed 
    { 
     get { return _ExecutingAssembly.ManifestModule.Name.TrimEnd('.', 'e', 'x'); } 
    } 
    public static String ApplicationPath 
    { 
     get { return _ExecutingAssembly.Location; } 
    } 
    public static String ApplicationVersion 
    { 
     get { return _ExecutingAssembly.GetName().Version.ToString(); } 
    } 
    public static DateTime ApplicationCompileDate 
    { 
     get { return File.GetCreationTime(Assembly.GetExecutingAssembly().Location); } 
    } 
    #endregion 
    private static Boolean _hasOpenWindows; 
    public static Boolean HasOpenWindows 
    { 
     get { return _hasOpenWindows; } 
     set { _hasOpenWindows = value; } 
    } 

    private static User _currentuser; 
    public static User CurrentUser 
    { 
     get { return _currentuser; } 
     set { _currentuser = value; } 
    } 
    private static Mantissa.DAL _datalayer; 
    public static Mantissa.DAL DataLayer 
    { 
     get { return _datalayer; } 
     set { _datalayer = value; } 
    } 
    private static string _connectionstring; 
    public static string ConnectionString 
    { 
     get { return _connectionstring; } 
     set { _connectionstring = value; } 
    } 





} 

Cela fonctionne:

`Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}"` 

Cela ne signifie pas: (jette la clé ne peut être nulle msg)

DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" 

Mais quand je mets la même propriété dans ma classe App alors cela fonctionne:

DataContext="{Binding Source={x:Static Application.Current}}" 

alors comment résoudre ce problème?

Répondre

11

x: Statique est utilisé pour obtenir des champs statiques et des propriétés. ApplicationInfo est une classe, pas une propriété. Pour lier, vous devez soit créer une instance de celui-ci et utiliser sa propriété d'instance, soit lier à une propriété statique (l'accès ne nécessite pas d'instances).

Si vous souhaitez lier à une propriété spécifique, utilisez Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}".

Si vous souhaitez définir DataContext et utiliser des liaisons avec d'autres propriétés, utilisez DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" et convertissez les propriétés statiques en propriétés d'instance (supprimer le mot clé statique). Vous serez également capable de lier comme ceci: Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}".

+0

Merci Athari, c'est utile. J'essayais d'éviter beaucoup de syntaxe de liaison supplémentaire sur quelques écrans afin que je puisse utiliser cette classe pour suivre l'utilisateur actuel, la chaîne de connexion actuelle, etc. Cette classe particulière n'a pas de sens pour convertir en classe d'instance parce que alors je devrais faire application myappref = (app) Application.Current; myappref.ApplicationInfoObject juste pour obtenir une référence à faire quelque chose avec. Donc je suppose que la syntaxe supplémentaire sera. – TWood

Questions connexes