我现在已经挣扎了近一天,并将其归结为以下几点:
我有一个名为MyUserControl的UserControl:
public partial class MyUserControl : UserControl
{
…
此UserControl有一个名为Property1的属性:
public MySubClass Property1 {get; set;}
如您所见,该属性属于MySubClass类型,这是一个定义如下所示的类:
[TypeConverter(typeof(ExpandableObjectConverter))]
public class MySubClass : INotifyPropertyChanged
{
//Declare event fired when a property has changed
public event PropertyChangedEventHandler PropertyChanged;
private double _subClassProperty1;
public double SubClassProperty1
{
get
{
return _subClassProperty1;
}
set
{
_subClassProperty1 = value;
OnPropertyChanged(); //Call method to raise event
}
}
//Raises the PropertyChanged event
protected void OnPropertyChanged()
{
PropertyChangedEventHandler handler = PropertyChanged; //Copy event handler to temporary variable to make it thread safe
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(""));
}
}
}
请注意,此类包含在类中更改属性时触发的事件(在这种情况下,只存在一个属性:SubClassProperty1)。
在UserControl的构造函数中,我订阅了子类中的事件,以便在更改属性时收到通知。构造函数如下所示:
public MyUserControl()
{
InitializeComponent();
Property1 = new MySubClass();
//Wire event fired when a property has been changed in sub class
Property1.PropertyChanged += MySubClass_PropertyChanged;
}
触发事件时调用的方法(位于用户控件类中)如下所示:
//Fired when a property has been changed in the sub class
private void MySubClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
MessageBox.Show("Property changed");
}
问题如下: 将用户控件拖动到窗体并更改子类的属性(SubClassProperty1)时,将触发事件并显示MessageBox(属性值的更改在设计时在Visual Studio的属性窗口中完成)。 如果我现在重建项目(Build-> Rebuild Solution),我在构造函数中执行的事件绑定将丢失,因此在更改SubClassProperty1的值时(再次在设计时),事件不再被触发。
如果我像这样将Property1的setter设为私有:
public MySubClass Property1 {get; private set;}
重建项目时事件绑定不会丢失,但现在SubClassProperty1的值不会保留(重建项目时会重置为默认值)。
问题: 我显然遗漏了一些关于如何纠正实现类类型属性的问题,但是我做错了什么?
总结:我希望能够通过Visual Studio的属性窗口中的用户控件类'属性设置子类的属性,而不会丢失事件绑定。