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

时间:2015-01-10 19:47:16

标签: c# wpf xaml static datacontext

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

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

如何设置控件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( );
        }
    }
}

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>

3 个答案:

答案 0 :(得分:12)

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

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

以下示例:

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

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

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

答案 1 :(得分:7)

从问题的原始版本:

  

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

这不是一个静态类。你永远不能拥有静态类的任何实例。

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

你可能正在寻找的是单身 - 你可以创建一个实例,而且大部分成员都是实例成员,但是在哪里&# 39; s保证只是一个实例。

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

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设置为专门知道获取当被引用的类型的静态成员上下文设置为一种类型,我看不到它的工作原理。

答案 2 :(得分:0)

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

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