4

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

我已经看到这个问题出现在几个论坛中,提供了各种解决方案,但没有一个非常令人满意。

好吧,我想我找到了一个优雅的解决方案,但它太简单了,我觉得我一定错过了一些东西。

答案是,编写一个访问静态变量的非静态属性,如下所示:

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

我已经对其进行了测试,它似乎工作得很好。我错过了什么吗?

4

4 回答 4

10

从技术上讲,您仍然没有绑定到静态属性 - 您正在绑定到类的实例,该实例使用静态字段作为后备存储。这在某种程度上会起作用,但是...

这有一个基本问题 - 如果您有多个项目绑定到同一个后备存储(这似乎是您正在尝试的事情,因为您故意将其设为静态),则INotifyPropertyChanged通知只会发生在您目前已绑定。

例如,假设您有两个并排放置的 UserControl,它们都绑定到包含此代码的 ViewModel。当控件 A 设置此属性时,控件 B 将永远不会收到通知(因为运行的是 A 的 INotifyPropertyChanged),因此它会显得不同步。

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

或者,您可能需要考虑在Singleton内使用单个实例属性(带有实例字段)。这也将为您提供“静态”属性的共享通知。

于 2009-12-18T01:46:08.007 回答
1

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

对不起,但我认为你做错了。
就个人而言,在不知道您的情况的情况下,我愿意猜测静态属性绑定并不是您真正需要的技术解决方案。
您要解决的问题是什么?
为什么不能通过普通绑定到 ViewModel 来更好地解决它?
做这样的事情的用例是什么?

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

于 2009-12-18T01:34:47.150 回答
0

多线程锁?

使用 get/set 实现 C# 线程安全

于 2009-12-18T01:20:01.147 回答
0

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

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

于 2009-12-18T03:03:30.793 回答