c# - wpf - 将数据上下文绑定(bind)到单例类的静态属性

标签 c# .net wpf binding

我发现自己对我的 App 类使用了很多单独的绑定(bind)来存储属性,这导致我遇到了无法追踪的 stackoverflow 异常。我现在决定将这些属性移动到一个单独的单例 ApplicationInfo 类,但我在绑定(bind)方面遇到了一些问题。

如果我直接绑定(bind)到我的类的成员属性,例如 CurrentUser,那么它工作正常。但是,当我尝试将数据上下文绑定(bind)到此类时,我遇到了编译器错误,而且我确信我忽略了一些简单的修改。

我已经从此类中创建了一个单例,但现在当我尝试编译时,我收到错误“未知构建错误 - 键不能为空”,它指向我的 Datacontext 绑定(bind)以获取错误消息。

这是我的类(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; }
    }





}

这个有效:

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

这不会:(抛出 key 不能为空消息)

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

但是当我将相同的属性放入我的 App 类中时,这就起作用了:

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

那我该如何解决呢?

最佳答案

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

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

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

关于c# - wpf - 将数据上下文绑定(bind)到单例类的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018472/

相关文章:

c# - 根据其中一个字段中的子字符串对对象列表进行分组

c# - 如何编写 EF Core 查询以过滤多个表?

c# - OrderBy 和 OrderByDescending 是否稳定?

.net - 添加或删除列时避免重建表?

c# - 将 IntPtr 转换为对象 C#

c# - 字符串到双转换(逗号到点的问题)

wpf - 在 WPF 中覆盖模板化按钮的命令

c# - 如何设置 htmlHelpers 项目,以便它为 mvc3 和 mvc4 生成两个 dll?

java - 任何快速简单的方法来散列小字节数组,以便最重要的位是最可变的?

.net - Autofac 解析具有混合范围的组件