Wpf - привязка datacontext к статическим свойствам одноэлементного класса

Я обнаружил, что использовал множество индивидуальных привязок к классу App для хранения свойств, и это привело меня к исключаемому исключению stackoverflow. Я решил, что я перенесу эти свойства в отдельный класс ApplicationInfo, но у меня возникают проблемы с привязкой.

Если я привязываю непосредственно к свойству-члену моего класса, например CurrentUser, тогда он работает нормально. Но когда я пытаюсь связать datacontext с этим классом, я получаю ошибки компилятора, и я уверен, что есть некоторые простые изменения, которые я пропустил.

Я создал синглтон из этого класса, но теперь, когда я пытаюсь скомпилировать, я получаю сообщение об ошибке "Неизвестная ошибка сборки - ключ не может быть пустым" и указывает на привязку к сообщению Datacontext для сообщения об ошибке.

Здесь мой класс:

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





}

Это работает:

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

Это не означает: (выбрасывает ключ не может быть null msg)

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

Но когда я помещаю одно и то же свойство в свой класс App, это работает:

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

так как я могу это исправить?

Ответ 1

x: Static используется для получения статических полей и свойств. ApplicationInfo - это класс, а не свойство. Для привязки вы должны либо создать экземпляр, либо использовать его свойство экземпляра, либо привязать его к статическому свойству (доступ к нему не требует экземпляров).

Если вы хотите привязываться к определенному свойству, используйте Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}".

Если вы хотите установить DataContext, а затем использовать привязки к другим свойствам, используйте DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" и преобразуйте статические свойства в свойства экземпляра (удалите статическое ключевое слово). Вы также сможете связать это: Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}".