绑定到静态类属性

15 浏览
0 Comments

绑定到静态类属性

我想将一个TextBlock的文本绑定到一个静态类的属性上。无论何时静态类的属性值发生变化,都应该反映在位于其他窗口或自定义控件上的TextBlock上。

0
0 Comments

问题出现的原因是使用静态类属性进行数据绑定时,如果不指定Mode=OneWay,会抛出异常。另外,可能会出现在XAML设计器中显示静态类不属于命名空间的错误,但程序运行时不会出错,并且代码片段仍然正常工作。可能是Intellisense中的一些bug导致的。

解决方法是在数据绑定时指定Mode=OneWay,这样可以避免异常的抛出。至于XAML设计器中显示错误的问题,可能是Intellisense的bug,可以尝试重新加载项目或者更新Intellisense来解决问题。

0
0 Comments

在使用嵌套静态类来组织/分离常量的情况下,如果你需要绑定到嵌套的静态类,似乎需要使用加号(+)运算符而不是点(.)运算符来访问嵌套的类:

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

示例:

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

这对我帮助很大,谢谢!是否有官方文档的链接来描述这个问题?

0
0 Comments

静态类的属性可以使用x:Static标记扩展进行绑定,但是如果它们没有实现任何更改跟踪,可能会导致刷新时出现错误!

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

也就是说,属性的setter需要引发PropertyChanged事件,就像任何绑定属性一样,才能正确刷新。

为了使代码片段工作,你需要在标签中添加"xmlns:sys="clr-namespace:System;assembly=mscorlib",否则命名空间"sys"未定义。

对于静态属性的PropertyChanged事件,我们发送什么作为sender参数?null?

通常情况下,对于静态属性,null可能是合适的;参见stackoverflow.com/questions/41519386/...

即使实现了静态属性通知,Source+x:Static并不能实现通知,你必须使用Path:<TextBlock Text="{Binding Path=(local:Foo.StaticBar)}"/>

0