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

Wil*_*ill 8 c# wpf datacontext xaml static

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

我已经声明它是静态的,因为类不需要实例声明,只能直接从应用程序范围读取.我有一个带有几个标签的控件,我想用它来显示一些这些信息.

我怎样才能将控件DataContext设置为等于类?

码:

/// <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( );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l G 12

您可以使用{x:Static}绑定语法绑定到静态字段或属性.

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

示例如下:

<DataContext Source="{x:Static prefix:typeName.staticMemberName}" />
Run Code Online (Sandbox Code Playgroud)

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

<TextBlock Text="{Binding Source={x:Static pi:ProgramInfo.ProgramName}}" /> 
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

从问题的原始版本:

我已经声明它是静态的,因为我只需要一个应用程序范围的可访问类的实例.

那不是静态类.你永远不会有任何静态类的实例.

虽然你现在已经改变了问题,但提到没有实例,但单个实例确实可能是一个更好的主意,因为通过数据上下文的绑定更适合实例.

您可能正在寻找的是单身人士 - 您可以在哪里创建实例,并且大多数成员都是实例成员,但保证只有单个实例.

你可以很容易地制作一个单身人士:

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
}
Run Code Online (Sandbox Code Playgroud)

还有其他各种实现选项,请注意 - 有关更多示例,请参阅我的主题页面.

然后你将其设置DataContext为引用单例实例.(我认为在WPF中这很容易 - 自从我完成它以来已经太久了.)

如果没有那个单独的实例,你可能设置的唯一的东西就是DataContext类型本身 - 除非WPF被设置为专门知道获取当上下文设置为类型时被引用的类型的静态成员,我看不出它有效.