实现在WPF和Silverlight中的静态属性上更改了INotifyProperty

时间:2009-12-18 01:12:11

标签: .net wpf silverlight xaml inotifypropertychanged

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:10)

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

这有一个根本问题 - 如果你有多个项目绑定到这个相同的后备存储(这似乎是你正在尝试的东西,因为你有意让它静态),INotifyPropertyChanged通知只会发生在您当前绑定的实例上。

比如说,你有两个并排坐着的UserControl,它们都绑定到包含这段代码的ViewModel。当控件A设置此属性时,控件B将永远不会收到通知(因为它是运行的A的INotifyPropertyChanged),因此它将显示为不同步。

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

锁定多线程?

C# thread safety with get/set

答案 3 :(得分:0)

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

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