【问题标题】:Binding to static class property [duplicate]绑定到静态类属性[重复]
【发布时间】:2011-04-21 05:15:28
【问题描述】:

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

【问题讨论】:

    标签: c# wpf binding textblock


    【解决方案1】:

    您可以使用x:Static 标记扩展绑定到静态类的任何属性,但如果您不实施任何更改跟踪,则可能会导致刷新错误!

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

    【讨论】:

    • 也就是说,属性设置器需要引发 PropertyChanged 事件,就像任何绑定的属性一样,才能正确刷新。
    • 您需要将“xmlns:sys="clr-namespace:System;assembly=mscorlib" 添加到您的 标记中以使代码片段工作,否则命名空间“sys”是未定义
    • @AlexPaven:当调用 PropertyChanged 事件时,我们发送什么作为 sender 参数?空?
    • 一般来说是静态属性?当然,我猜 null 是合适的;见stackoverflow.com/questions/41519386/…
    【解决方案2】:

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

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

    例子:

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

    【讨论】:

    • 这对我很有帮助,谢谢!官方文档的链接在哪里描述?
    【解决方案3】:

    这对我有用:

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

    没有Mode=OneWay我得到了一个例外。

    【讨论】:

    • 这种方法在技术上适用于我,但有一个奇怪的错误。当我使用这样的 sn-p 时,它表示我的静态类不是命名空间(它是)的一部分,这给了我 xaml 设计器上的“无效标记”屏幕。奇怪的是,当我运行程序时它不会出错。不仅如此,显示错误的 sn-p 运行良好。知道是什么原因造成的吗?
    • @ARidder101 不知道。对不起。自从我处理这个问题以来已经有一段时间了。但这可能只是智能感知中的一些错误。
    【解决方案4】:

    它对我有用!

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

     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}}"/>
    

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 2014-09-10
      • 2015-10-15
      • 2016-01-06
      • 2010-10-30
      • 2012-10-15
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多