views:

48

answers:

1

I found myself using a lot of individual bindings to my App class for storage of properties and this led me to a untracable stackoverflow exception. I've now decided I would move those properties to a separate singleton ApplicationInfo class but I am having some issues with the binding.

If I bind directly to a member property of my class, such as CurrentUser then it works fine. But when I try to bind a datacontext to this class I get compiler errors and I am sure there is some simple modification that i've overlooked.

I've created a singleton out of this class but now when I try to compile I get the error "Unknown build error - key cannot be null" and it points to my Datacontext binding for the error message.

Here's my class:

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





}

This works:

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

This does not: (throws the key cannot be null msg)

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

But when I put the same property in my App class then this works:

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

so how do I fix this?

A: 

x:Static is used to get static fields and properties. ApplicationInfo is a class, not a property. To bind, you must either create an instance of it and use its instance property, or bind to a static property (accessing it doesn't require instances).

If you want to bind to a specific property, use Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}".

If you want to set DataContext and then to use bindings to other properties, use DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" and convert static properties to instance properties (remove static keyword). You'll also be able to bind like this: Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}".

Current property is usually named Instance, by the way.

Athari
Thanks Athari, this is helpful. I was trying to avoid a lot of extra binding syntax on a couple of screens so that I could use this class to track the current user, current connection string, etc. This particular class doesn't make sense to convert to an instance class because then i'd have to do application myappref = (app)Application.Current;myappref.ApplicationInfoObject just to get ahold of a reference to do something with. So I guess the extra syntax it will be.
TWood