我可以将 DataContext 设置为静态 class 吗?
Can I set a DataContext to a static class?
我有一个静态 class 从应用程序程序集中读取信息。
我已将其声明为静态的,因为 class 不需要实例声明,并且只会在应用程序范围内直接读取。我有一个带有多个标签的控件,我想用它们来显示其中的一些信息。
如何将控件 DataContext 设置为等于 class?
代码:
/// <summary>
/// Class for Reading Program Information.
/// </summary>
public static class ProgramInfo {
private static Assembly ProgramAssembly = Assembly.GetEntryAssembly( );
/// <summary>
/// Get Program Name
/// </summary>
public static string ProgramName {
get { return ProgramInfo.ProgramAssembly.GetCustomAttribute<AssemblyProductAttribute>( ).Product; }
}
/// <summary>
/// Get Program Build Date
/// </summary>
public static DateTime BuildDate {
get { return File.GetLastWriteTime( ProgramInfo.ProgramAssembly.Location ); }
}
/// <summary>
/// Get Program Version (Major.Minor)
/// </summary>
public static string Version {
get {
System.Version V = ProgramInfo.ProgramAssembly.GetName( ).Version;
return V.Major.ToString( ) + '.' + V.Minor.ToString( );
}
}
/// <summary>
/// Get Program Build (Build.Revision)
/// </summary>
public static string Build {
get {
System.Version V = ProgramInfo.ProgramAssembly.GetName( ).Version;
return V.Build.ToString( ) + '.' + V.Revision.ToString( );
}
}
}
XAML:
<UserControl x:Class="Tools.Controls.ProgramInformation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pi="clr-namespace:Tools.Controls">
<UserControl.DataContext>
<pi:ProgramInfo/>
</UserControl.DataContext>
<!--Other Irrelevant Code-->
</UserControl>
来自原版问题:
I've declared it static since I will only ever need a single application-wide accessible instance of the class.
那不是静态的 class。您永远不能拥有静态 class.
的 any 个实例
尽管您现在已将问题更改为指的是 没有 个实例,但单个实例确实可能是一个更好的主意,因为通过数据上下文进行绑定更适合例如。
您可能正在寻找的是 单例 - 您可以在其中 创建一个实例,并且大多数成员都是实例成员,但保证只有一个实例。
你可以很容易地制作单例:
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
}
请注意,还有各种其他实施选项 - 请参阅 my page on the topic 了解更多示例。
然后您将 DataContext
设置为引用单例实例。 (我认为这在 WPF 中很容易 - 我已经太久没做过了。)
如果没有那个单一实例,您唯一可以设置 DataContext
的就是类型本身 - 除非 WPF 设置为专门知道获取正在访问的类型的静态成员当上下文设置为类型时引用,我看不到它工作。
您可以使用 {x:Static} 绑定语法绑定到静态字段或 属性。
x:Static 用于获取静态字段和属性。您可以将数据上下文设置为静态字段或 属性,但不能设置为静态类型。
示例如下:
<DataContext Source="{x:Static prefix:typeName.staticMemberName}" />
您最好忽略数据上下文,只为每个要绑定的值使用 {x:Static 绑定。例如,下面将绑定程序名称 static 属性:
<TextBlock Text="{Binding Source={x:Static pi:ProgramInfo.ProgramName}}" />
此语法也适用于静态属性的数据绑定而不会产生错误(我不知道为什么):
DataContext={绑定路径=(前缀:TypeName.StaticPropertyName)}
我有一个静态 class 从应用程序程序集中读取信息。
我已将其声明为静态的,因为 class 不需要实例声明,并且只会在应用程序范围内直接读取。我有一个带有多个标签的控件,我想用它们来显示其中的一些信息。
如何将控件 DataContext 设置为等于 class?
代码:
/// <summary>
/// Class for Reading Program Information.
/// </summary>
public static class ProgramInfo {
private static Assembly ProgramAssembly = Assembly.GetEntryAssembly( );
/// <summary>
/// Get Program Name
/// </summary>
public static string ProgramName {
get { return ProgramInfo.ProgramAssembly.GetCustomAttribute<AssemblyProductAttribute>( ).Product; }
}
/// <summary>
/// Get Program Build Date
/// </summary>
public static DateTime BuildDate {
get { return File.GetLastWriteTime( ProgramInfo.ProgramAssembly.Location ); }
}
/// <summary>
/// Get Program Version (Major.Minor)
/// </summary>
public static string Version {
get {
System.Version V = ProgramInfo.ProgramAssembly.GetName( ).Version;
return V.Major.ToString( ) + '.' + V.Minor.ToString( );
}
}
/// <summary>
/// Get Program Build (Build.Revision)
/// </summary>
public static string Build {
get {
System.Version V = ProgramInfo.ProgramAssembly.GetName( ).Version;
return V.Build.ToString( ) + '.' + V.Revision.ToString( );
}
}
}
XAML:
<UserControl x:Class="Tools.Controls.ProgramInformation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:pi="clr-namespace:Tools.Controls">
<UserControl.DataContext>
<pi:ProgramInfo/>
</UserControl.DataContext>
<!--Other Irrelevant Code-->
</UserControl>
来自原版问题:
I've declared it static since I will only ever need a single application-wide accessible instance of the class.
那不是静态的 class。您永远不能拥有静态 class.
的 any 个实例尽管您现在已将问题更改为指的是 没有 个实例,但单个实例确实可能是一个更好的主意,因为通过数据上下文进行绑定更适合例如。
您可能正在寻找的是 单例 - 您可以在其中 创建一个实例,并且大多数成员都是实例成员,但保证只有一个实例。
你可以很容易地制作单例:
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
}
请注意,还有各种其他实施选项 - 请参阅 my page on the topic 了解更多示例。
然后您将 DataContext
设置为引用单例实例。 (我认为这在 WPF 中很容易 - 我已经太久没做过了。)
如果没有那个单一实例,您唯一可以设置 DataContext
的就是类型本身 - 除非 WPF 设置为专门知道获取正在访问的类型的静态成员当上下文设置为类型时引用,我看不到它工作。
您可以使用 {x:Static} 绑定语法绑定到静态字段或 属性。
x:Static 用于获取静态字段和属性。您可以将数据上下文设置为静态字段或 属性,但不能设置为静态类型。
示例如下:
<DataContext Source="{x:Static prefix:typeName.staticMemberName}" />
您最好忽略数据上下文,只为每个要绑定的值使用 {x:Static 绑定。例如,下面将绑定程序名称 static 属性:
<TextBlock Text="{Binding Source={x:Static pi:ProgramInfo.ProgramName}}" />
此语法也适用于静态属性的数据绑定而不会产生错误(我不知道为什么):
DataContext={绑定路径=(前缀:TypeName.StaticPropertyName)}