1

2 つの静的プロパティを持つクラスを作成しました。

public class CParametres
{

    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

    private  static Color m_ThemeColorGradientBegin;
    public  static Color ThemeColorGradientBegin
    {
        get { return m_ThemeColorGradientBegin; }
        set
        {
            m_ThemeColorGradientBegin = value;
            NotifyStaticPropertyChanged("ThemeColorGradientBegin");
        }
    }

    private  static Color m_ThemeColorGradientEnd;
    public  static Color ThemeColorGradientEnd
    {
        get { return m_ThemeColorGradientEnd; }
        set
        {
            m_ThemeColorGradientEnd = value;
            NotifyStaticPropertyChanged("ThemeColorGradientEnd");
        }
    }

    public CParametres()
    {
     ....   
    }

    public void setThemeGradient(Color ColorBegin, Color ColorEnd)
    {
        ThemeColorGradientBegin = ColorBegin;
        ThemeColorGradientEnd = ColorEnd;
    }

    private static void NotifyStaticPropertyChanged(string propertyName)
    {
        if (StaticPropertyChanged != null)
        {
            StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
        }
    }

}

私の問題は、2 つのプロパティを設定するために setThemeGradient() を使用すると、通知イベントが発生しないことです。(バインディングを作るためです)

誰にもアイデアがありますか?

どうもありがとう、

よろしくお願いします、

ニクセウス

4

2 に答える 2

2

あなたは実際にはしませんでしたimplement INotifyPropertyChanged...

になることはできませんstatic

INotifyPropertyChanged を適切に実装してから、インスタンスのプロパティにバインドする必要があります。

public sealed class YourClass : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName) { this.PropertyChanged.Raise(this, new PropertyChangedEventArgs(propertyName)); } // my 'raise' use typical event handling  

    public static readonly YourClass Instance = new YourClass(); // your ctor params if needed
    private YourClass() // ensure only you can 'construct'
    { }

    // call OnPropertyChanged from your properties
    // implement 'non-static' properties

次に、ビューモデルを使用して適切なインスタンスを取得します (CParameters がどこに属しているか、vm がどのように見えるかはわかりません)。

または、インスタンスが必要な場合は、x:Static を介してバインディングを実行し、「シングルトン」を介して「インスタンス」をクラスに公開できます。 CParameters.Instance

例えば

{Binding Path=Property, Source={x:Static my:YourClass.Instance}}  

ビューモデル階層を介して適切なバインドを行うことをお勧めしますが。

注:
1) 典型的な INotifyPropertChanged の実装
2) 外部アクセス用に、Singleton' implementation - which issealed (not required but good),private` ctor (必須ではありませんが推奨) - および読み取り専用の静的プロパティ - を追加します。

于 2013-04-11T19:59:28.233 に答える
0
    public event PropertyChangedEventHandler PropertyChanged;

    // This method is called by the Set accessor of each property. 
    // The CallerMemberName attribute that is applied to the optional propertyName 
    // parameter causes the property name of the caller to be substituted as an argument. 
    private void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null && !String.IsNullOrEmpty(propertyName))
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
于 2013-04-11T20:00:22.730 に答える