2010-10-25 113 views
10

我發現自己使用了很多單獨綁定到我的App類來存儲屬性,這導致我陷入了一個難以逾越的stackoverflow異常。我現在決定將這些屬性移到一個單獨的單例ApplicationInfo類中,但我在綁定時遇到了一些問題。wpf - 將datacontext綁定到單例類的靜態屬性

如果我直接綁定到我的類的成員屬性,如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'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; } 
    } 





} 

這工作:

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

這不:(拋出鍵不能爲空MSG)

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

但是,當我把在我的應用類相同的屬性,然後這個作品:

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

那麼我該如何解決這個問題?

回答

11

x:靜態用於獲取靜態字段和屬性。 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}}"

+0

感謝Athari,這很有幫助。我試圖在幾個屏幕上避免大量額外的綁定語法,這樣我就可以使用這個類來跟蹤當前用戶,當前連接字符串等。這個特定的類沒有意義轉換爲實例類,因爲那麼我必須做 應用程序myappref =(app)Application.Current;myappref.ApplicationInfoObject只是爲了得到一個引用來做某事。所以我猜想它會是額外的語法。 – TWood 2010-10-25 20:48:51