绑定静态类属性

55

我想将文本块的文本绑定到静态类的属性。每当静态类的属性值更改时,应该反映在另一个窗口或自定义控件上的文本块中。

4个回答

86

你可以使用 x:Static 标记扩展绑定到静态类上的任何属性,但如果它们没有实现任何更改跟踪,可能会在刷新时引发错误!

<TextBlock Text="{Binding Source={x:Static sys:Environment.MachineName}}" />

1
也就是说,属性的设置器需要像任何绑定属性一样引发PropertyChanged事件,以便正确地刷新。 - Alex Paven
1
你需要在<Window>标记中添加“xmlns:sys="clr-namespace:System;assembly=mscorlib"”才能使代码片段正常工作,否则命名空间“sys”未定义。 - DonGru
@AlexPaven:在调用PropertyChanged事件时,我们将什么作为“sender”参数发送?null吗? - Fandi Susanto
一般来说,对于静态属性,我想null可能是合适的选择;请参见https://stackoverflow.com/questions/41519386/static-property-using-inotifypropertychanged-c-sharp - Alex Paven
即使实现了静态属性通知,Source+x:Static 也不能启用通知,你必须使用 Path<TextBlock Text="{Binding Path=(local:Foo.StaticBar)}"/> - CodingNinja

24

对于那些使用嵌套静态类来组织/区分常量的人。如果您需要绑定到嵌套静态类,则似乎需要使用加号(+)运算符而不是点(.)运算符来访问嵌套类:

{Binding Source={x:Static namespace:StaticClass+NestedStaticClasses.StaticVar}}

示例:

public static class StaticClass
    {
        public static class NestedStaticClasses
        {
            public static readonly int StaticVar= 0;

        }
    }

1
这对我很有帮助,谢谢!有官方文档的链接吗? - psulek

20

这对我有用:

Text="{Binding Source={x:Static MyNamespace:MyStaticClass.MyProperty}, Mode=OneWay}"

没有使用Mode=OneWay我收到了一个异常。


这个方法在技术上对我有效,但出现了奇怪的错误。当我使用像这样的代码片段时,它会说我的静态类不是命名空间的一部分(实际上它是的),这会在设计师中给我一个“无效标记”屏幕。奇怪的是,当我运行程序时,它并没有出错。更重要的是,显示错误的代码片段正在完美地工作。你有什么想法是什么原因导致这种情况? - ARidder101
2
@ARidder101 不好意思,我也不知道。我已经有一段时间没有处理这个问题了。但可能只是智能感知中的一些错误。 - NoOne

-1

它对我有用!

当您拥有像这样的静态属性的静态类时

 namespace App.Classes
 {
     public static class AppData
     {
         private static ConfigModel _configModel;
         public static ConfigModel Configuration
         {
            get { return _configModel; }
            set { _configModel = value; }
         }
     }

     public class ConfigModel : INotifyPropertyChanged
     {
         public event PropertyChangedEventHandler PropertyChanged;

          private bool _text = true;
          public bool Text
          {
               get { return _text ; }
               set { 
                     _text = value; 
                     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Text"));
               }
          }
      }
}

你可以像这样将它绑定到 XAML。

xmlns:c="clr-namespace:App.Classes"

<TextBlock Text="{Binding Path=Text, Source={x:Static c:AppData.Configuration}}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接