2010-10-25 11 views
10

Znalazłem się przy użyciu wielu indywidualnych powiązań z moją klasą App do przechowywania właściwości i to doprowadziło mnie do wyjątku niestabilnego stackoverflow. Zdecydowałem, że przeniesię te właściwości do oddzielnej pojedynczej klasy ApplicationInfo, ale mam pewne problemy z powiązaniem.wpf - wiążący datacontext do właściwości statycznych singleton class

Jeśli wiążę się bezpośrednio z właściwością członka mojej klasy, taką jak CurrentUser, to działa poprawnie. Ale kiedy próbuję powiązać datakontekst z tą klasą, dostaję błędy kompilatora i jestem pewna, że ​​są pewne proste modyfikacje, które przeoczyłem.

Stworzyłem singleton z tej klasy, ale teraz, gdy próbuję skompilować, pojawia się błąd "Nieznany błąd kompilacji - klucz nie może być pusty" i wskazuje on na moje powiązanie danych w trybie Datacontext dla komunikatu o błędzie.

Oto moja klasa:

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





} 

to działa:

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

To nie: (rzuca klucz nie może być null MSG)

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

Ale kiedy kładę Ta sama właściwość w mojej klasie App to działa:

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

więc jak to naprawić?

Odpowiedz

11

x: Statyczny służy do uzyskiwania statycznych pól i właściwości. ApplicationInfo jest klasą, a nie właściwością. Aby powiązać, musisz albo utworzyć jego instancję i użyć jej właściwości instancji, albo powiązać z właściwością statyczną (dostęp do niej nie wymaga instancji).

Jeśli chcesz powiązać określoną właściwość, użyj Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}".

Jeśli chcesz ustawić DataContext, a następnie użyć powiązań z innymi właściwościami, użyj DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" i przekonwertuj właściwości statyczne na właściwości instancji (usuń statyczne słowo kluczowe). Będziesz także mógł powiązać w ten sposób: Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}".

+0

Dzięki Athari, to jest pomocne. Próbowałem uniknąć wielu dodatkowych składni na kilku ekranach, dzięki czemu mogłem użyć tej klasy do śledzenia bieżącego użytkownika, bieżącego ciągu połączenia itp. Ta konkretna klasa nie ma sensu konwertować do klasy instancji, ponieważ wtedy musiałbym wykonać aplikację: myappref = (app) Application.Current; myappref.ApplicationInfoObject tylko po to, aby uzyskać referencję do zrobienia czegoś. Więc myślę, że będzie to dodatkowa składnia. – TWood

Powiązane problemy