2009-12-18 14 views
4

问题是如何在静态属性上实现INotifyPropertyChanged,因为您实现的事件不是静态的,并且不能由静态属性调用。此外,您无法绑定到Silverlight中的静态属性。在WPF和Silverlight的静态属性中实现INotifyProperty更改

我见过这个问题弹出几个论坛与各种解决方案,其中没有一个是非常令人满意的。

嗯,我想我已经找到了一个优雅的解决方案,但它很简单,我觉得我必须错过一些东西。

答案是,写访问一个静态变量,像这样的非静态属性:我已经测试过它

private static double length; 
    public double Length 
    { 
     get 
     { 
      return length; 
     } 
     set 
     { 
      length = value; 
      NotifyPropertyChanged("Length"); 
     } 
    } 

,它似乎工作得很好。我错过了什么吗?

回答

10

从技术上讲,你还没有绑定到一个静态属性 - 你绑定到一个类的实例,它使用静态字段作为后备存储。这将工作,在一定程度上,但是......

没有与此一个根本性的问题 - 如果你有一个以上的项目绑定到这个相同的后备存储(这似乎是你尝试的东西,因为你”有意将其设为静态),则INotifyPropertyChanged通知将只发生在当前绑定的实例上。

例如说,您有两个UserControl并排坐在一起,它们都绑定到一个包含此代码的ViewModel。当控件的设置此属性,控制B就永远不会收到通知(因为它是一个的INotifyPropertyChanged的运行),因此会出现不同步的。

如果你真的想尝试做这样的事情,最好让后备商店使用一个实现INotifyPropertyChanged的类,并通过你的ViewModel类“泡”出属性。这样,多个实例都将被正确通知,并且您可以处理可能发生的任何多线程/同步问题(如有必要)。

或者,你可能要考虑使用单一实例属性(用一个实例字段),一个Singleton内。这也会给你“静态”属性的共享通知。

+0

谢谢你,这是很清楚:) 我不熟悉这个术语视图模型,我的第一个谷歌带来了有关MVVM设计模式的文章,那是什么你在说什么?如果是的话,我会读更多关于它。 – Eric

+0

是的。一般来说,无论我在哪里说ViewModel,只需输入“您用作DataContext的类”。不过,MVVM值得了解,如果你打算做WPF或Silverlight开发。 –

+0

当你说房产泡沫时,你的意思是什么?我试图让NotifyPropertyChanged影响所有实例。 – tofutim

1

权,但它不是一个真正的静态属性,是吗?
它是一个使用静态后台字段的公共实例属性。
实质上,你绑定到一个类的特定实例。

对不起,但我认为你做错了。
个人而言,如果不知道你是场景,我愿意猜测静态属性绑定并不是真正需要的技术解决方案。
你在努力解决什么问题?
为什么不通过对ViewModel的正常绑定解决更好?
做这种事情的用例是什么?

就个人而言,这看起来像一个完美的场景,有一个ViewModel注册到单例服务,并且一旦引发单例事件,就会更改ViewModel属性。

0

为什么该属性必须是静态的?如果它只是一个常规的实例属性,这不会是一个问题。

避免共享可变状态时可能:)