WPF - 将DataContext绑定到单例类的静态属性

11

我发现自己在应用程序类中经常使用单个绑定来存储属性,这导致了一个难以追踪的stackoverflow异常。现在我决定将这些属性移动到一个单独的单例ApplicationInfo类中,但我在绑定方面遇到了一些问题。

如果我直接绑定到我的类的成员属性,例如CurrentUser,那么它就可以正常工作。但是当我尝试将数据上下文绑定到此类时,我会得到编译器错误,并且我确定我已经忽略了一些简单的修改。

我已经将这个类创建为单例,但是现在当我尝试编译时,我会得到错误“未知生成错误 - 键不能为空”,并且它指向我的数据上下文绑定作为错误消息。

这是我的类:

 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}}"`

这个不行:(抛出“键不能为空”的错误消息)

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

但是当我将相同的属性放在我的App类中时,它就有效了:

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

那我该如何修复这个问题?

1个回答

12

x:Static 用于获取静态字段和属性。 ApplicationInfo 是一个类而不是属性。 若要绑定,则必须创建它的实例并使用其实例属性,或绑定到静态属性(访问它不需要实例)。

如果想要绑定到特定的属性,请使用 Title="{Binding Source={x:Static my:ApplicationInfo.ApplicationNameTrimmed}}"

如果要设置 DataContext 并使用其他属性的绑定,请使用 DataContext="{Binding Source={x:Static my:ApplicationInfo.Current}}" 并将静态属性转换为实例属性(删除 static 关键字)。您还可以像这样进行绑定:Title="{Binding Source={x:Static my:ApplicationInfo.Current.ApplicationNameTrimmed}}"


谢谢Athari,这很有帮助。我试图避免在一些屏幕上使用大量的额外绑定语法,以便我可以使用这个类来跟踪当前用户、当前连接字符串等。这个特定的类转换为实例类没有意义,因为那样我就必须做 application myappref = (app)Application.Current; myappref.ApplicationInfoObject 只是为了获取一个引用来做一些事情。所以我想额外的语法就行了。 - TWood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接