类类型属性会中断有线事件

时间:2014-05-16 15:32:48

标签: c# winforms visual-studio events properties

我现在已经挣扎了近一天,并将其归结为以下几点:

我有一个名为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的属性窗口中的用户控件类'属性设置子类的属性,而不会丢失事件绑定。

0 个答案:

没有答案