4

問題は、実装INotifyPropertyChangedするイベントが静的ではなく、静的プロパティから呼び出すことができないため、静的プロパティに実装する方法です。また、Silverlightの静的プロパティにバインドすることはできません。

私はこの質問がさまざまな解決策を備えたいくつかのフォーラムをポップアップするのを見ましたが、どれも非常に満足のいくものではありませんでした。

さて、私はエレガントな解決策を見つけたと思いますが、それはとても単純なので、何かが欠けているに違いないように感じます。

答えは、次のように静的変数にアクセスする非静的プロパティを作成することです。

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

私はそれをテストしました、そしてそれはうまくいくようです。私は何かが足りないのですか?

4

4 に答える 4

10

技術的には、まだ静的プロパティにバインドしていません。静的フィールドをバッキング ストアとして使用しているクラスのインスタンスにバインドしています。これである程度はうまくいきますが…

これには根本的な問題があります - この同じバッキング ストアに複数のアイテムがバインドされている場合 (意図的に静的にしているため、これは試みているように見えます)、INotifyPropertyChanged通知は次のインスタンスでのみ発生します。あなたは現在拘束されています。

たとえば、2 つの UserControls が並んでいて、両方ともこのコードを含む 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 に答える