2016-03-03 115 views
-2

我遇到问题,如下所述。我是新来的.NET/Visual Studio(2013),我想弄清楚为什么下面的代码不会工作。事件处理 - Visual Studio

我有下面的类

public class PropertySettings 
{ 
    ... 

    // get single instance of this class 
    public static PropertySettings Instance 
    { 
     get { return thisInstance; } 
    } 

    // event declaration 
    public event EventHandler<MyObj> PropertyChanged; 

    ... 

    public void SaveProperty(string propertyName, object obj) 
    { 
     var oldValue = obj.OldVal; 
     var newValue = obj.NewVal; 

     // Why is PropertyChanged event always null? 
     if (PropertyChanged != null && oldValue != newValue) 
     { 
      PropertyChanged(this, obj); // pass reference to itself 
     } 
    } 
} 

的SaveProperty方法检查的PropertyChanged!= null,并且如果是这样,它通过传递到自身的引用和OBJ调用它。

然后SaveProperty方法被称为从其他类这样的:

PropertySettings.Instance.SaveProperty("Width", Width); 

我遇到的问题是,的PropertyChanged总是空,因此PropertyChanged事件不会被调用。

+1

你在哪里连接PropertyChanged事件处理程序? –

+2

什么都订阅了'PropertyChanged'?它不会有价值,除非它至少有一个用户。 – lintmouse

+0

水晶球说,你应该使这个类的构造函数*私人*。现在编译器会告诉你你做错了什么。 –

回答

1

如果你有你的类的实例:

var x = new PropertySettings(); 

然后你需要 “线了” 任何事件处理程序是这样的:

// "wire up" AKA "subscribe to" AKA "register" event handler. 
x.PropertyChanged += HandlePropertyChanged; 

// e.g. event handler... 
void HandlePropertyChanged(object sender, object e) 
{ 
    throw new NotImplementedException(); 
} 

否则,PropertyChanged == nulltrue

+0

这非常有帮助,谢谢。我上面的类是一个单例,你可以看到它的方法来保存设置如上所述调用。所以,我想你的建议“连线/订阅/注册”事件处理程序应添加到PropertySettings类的某处?这是正确的,如果是这样的话?非常感激。 – pixel

+1

当然。任何你想的地点都可以。我会留给你的。 –

+0

非常感谢roryap – pixel

相关问题