Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以将DataContext设置为静态类吗?_C#_Wpf_Xaml_Static_Datacontext - Fatal编程技术网

C# 我可以将DataContext设置为静态类吗?

C# 我可以将DataContext设置为静态类吗?,c#,wpf,xaml,static,datacontext,C#,Wpf,Xaml,Static,Datacontext,我有一个静态类,它从应用程序集读取信息 我将其声明为静态的,因为该类不需要实例声明,并且只能从应用程序范围内直接读取。我有一个带有几个标签的控件,我想用它来显示一些信息 如何将控件DataContext设置为类 代码: // ///用于读取程序信息的类。 /// 公共静态类ProgramInfo{ 私有静态程序集programmably=Assembly.GetEntryAssembly(); /// ///获取程序名 /// 公共静态字符串程序名{ get{return ProgramI

我有一个静态类,它从应用程序集读取信息

我将其声明为静态的,因为该类不需要实例声明,并且只能从应用程序范围内直接读取。我有一个带有几个标签的控件,我想用它来显示一些信息

如何将控件DataContext设置为类

代码:

//
///用于读取程序信息的类。
/// 
公共静态类ProgramInfo{
私有静态程序集programmably=Assembly.GetEntryAssembly();
/// 
///获取程序名
/// 
公共静态字符串程序名{
get{return ProgramInfo.ProgramAssembly.GetCustomAttribute().Product;}
}
/// 
///获取程序生成日期
/// 
公共静态日期时间构建日期{
获取{return File.GetLastWriteTime(ProgramInfo.ProgramAssembly.Location);}
}
/// 
///获取程序版本(大调、小调)
/// 
公共静态字符串版本{
得到{
Version V=ProgramInfo.ProgramAssembly.GetName().Version;
返回V.Major.ToString()+'.+V.Minor.ToString();
}
}
/// 
///获取程序生成(Build.Revision)
/// 
公共静态字符串生成{
得到{
Version V=ProgramInfo.ProgramAssembly.GetName().Version;
返回V.Build.ToString()+'.+V.Revision.ToString();
}
}
}
XAML:


问题的原始版本:

我将它声明为静态的,因为我将永远只需要该类的单个应用程序范围的可访问实例

静态类不是这样的。您永远不能有任何静态类的实例

虽然您现在已将问题改为不存在实例,但单个实例可能确实是一个更好的主意,因为通过数据上下文绑定更适合实例

您可能正在寻找的是一个单实例—您可以在其中创建一个实例,并且大多数成员都是实例成员,但保证只有一个实例

您可以非常轻松地创建单身:

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();

    public static Singleton Instance { get { return instance; } }

    // Private constructor to prevent instantiation
    private Singleton() {}

    // Instance members from here onwards
}
还有其他各种实现选项,请注意,有关更多示例,请参见

然后将
DataContext
设置为引用singleton实例。(我认为在WPF中这很容易——我已经很久没有这么做了。)


如果没有这个实例,您唯一可能将
DataContext
设置为的就是类型本身——除非WPF被设置为专门知道在将上下文设置为类型时获取所引用类型的静态成员,我看不出它在工作。

您可以使用绑定语法绑定到静态字段或属性

x:Static用于获取静态字段和属性。可以将datacontext设置为静态字段或属性,但不能设置为静态类型

示例如下:

<DataContext Source="{x:Static prefix:typeName.staticMemberName}" />

更合适的做法是忽略datacontext,只对每个要绑定的值使用{x:Static绑定。例如,下面将绑定程序名静态属性:

<TextBlock Text="{Binding Source={x:Static pi:ProgramInfo.ProgramName}}" /> 

此语法也适用于数据绑定到静态属性而不产生错误(我不知道为什么):


DataContext={绑定路径=(前缀:TypeName.StaticPropertyName)}

好的,是的,我使用了不正确的方言。我根本不想要这个类的任何实例。我只想要一个可以访问这些信息的结构。编辑…@Will:那么你不能将
DataContext
属性设置为该属性。我怀疑你真的想要使用单个实例的东西-请参阅我的编辑以了解如何做到这一点。然后,如果我以这种方式实现它,我希望在类本身中没有静态属性,对吗?@Will:没错-它们应该是实例属性。我得到了一个错误:类型不包含任何可访问的构造函数。我想这正是我要找的。
<DataContext Source="{x:Static prefix:typeName.staticMemberName}" />
<TextBlock Text="{Binding Source={x:Static pi:ProgramInfo.ProgramName}}" />