2010-10-25 9 views
10

Me encontré usando muchos enlaces individuales a mi clase de aplicación para el almacenamiento de propiedades y esto me llevó a una excepción de stackflow inoperable. Ahora he decidido mover esas propiedades a una clase de ApplicationInfo única e individual, pero estoy teniendo problemas con el enlace.wpf - datacontext de enlace a propiedades estáticas de la clase singleton

Si me enlace directamente a una propiedad miembro de mi clase, como CurrentUser, funciona bien. Pero cuando intento vincular un contexto de datos a esta clase obtengo errores de compilación y estoy seguro de que hay algunas modificaciones simples que he pasado por alto.

He creado un singleton fuera de esta clase pero ahora, cuando intento compilar, aparece el error "Error de construcción desconocido: la clave no puede ser nula" y apunta a mi enlace Datacontext para el mensaje de error.

Aquí es mi clase:

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; } 
    } 





} 

Esto funciona:

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

Esto no es así: (lanza la llave no puede ser msg nula)

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

Pero cuando pongo el misma propiedad en mi clase de la aplicación, entonces esto funciona:

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

entonces, ¿cómo puedo arreglar esto?

Respuesta

11

x: Static se utiliza para obtener campos y propiedades estáticos. ApplicationInfo es una clase, no una propiedad. Para enlazar, debe crear una instancia de la misma y usar su propiedad de instancia, o vincularse a una propiedad estática (para acceder a ella no se requieren instancias).

Si desea enlazar a una propiedad específica, use Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}".

Si desea establecer DataContext y luego usar enlaces a otras propiedades, use DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" y convierta propiedades estáticas a propiedades de instancia (elimine la palabra clave estática). También podrá enlazar así: Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}".

+0

Gracias Athari, esto es útil. Estaba tratando de evitar una gran cantidad de sintaxis de enlace adicional en un par de pantallas para poder usar esta clase para rastrear el usuario actual, la cadena de conexión actual, etc. Esta clase en particular no tiene sentido convertirla a una clase de instancia porque entonces tendría que hacer la aplicación myappref = (app) Application.Current; myappref.ApplicationInfoObject solo para obtener una referencia para hacer algo. Así que supongo que será la sintaxis adicional. – TWood

Cuestiones relacionadas