显示组件后,C#/ MonoTouch EventHandler变为null;代表失踪?

时间:2010-10-13 00:36:18

标签: c# ios xamarin.ios event-handling

我有一个UIPickerViewModel,它应该在所选值发生变化时触发事件,但是在调用Selected时,EventHandler为空。代码(稍微简化):

public class MyPickerViewModel: UIPickerViewModel {
    public event EventHandler SelectionChanged;

    public void PrintWhetherSelectionChangedIsNull() {
         System.Console.WriteLine(SelectionChanged == null ? "yes" : "no");
    }

    public override void Selected(UIPickerView picker, int row, int comp) {
        if (SelectionChanged != null) { // it always is, though
            SelectionChanged(this, new EventArgs());
        }
    }
}

public class SomeView: UIView {
    SomeView(MyPickerViewModel model) {
        model.SelectionChanged += delegate(object s, EventArgs e) { 
            DoSomething();
        }

        model.PrintWhetherSelectionChangedIsNull(); // prints "no"
    }

    private void DoSomething() { /* never called */ }
}

我很确定该模型只有一个实例,并且EventHandler在再次变为null之前是非空的。

我猜测我添加到EventHandler的代表正在收集垃圾或其他东西,但这只是猜测。有人能指出我对C#/ iOS对象生命周期的一个很好的入门读物吗?

更新:我尝试在视图上使用名为EventHandler的实例变量,问题仍然存在。所以这不仅仅是一个垃圾收集问题。

1 个答案:

答案 0 :(得分:0)

尝试更新SomeView,以便存储模型值,只是为了确保它不会因某种原因释放自身的引用。

public class SomeView: UIView { 

    MyPickerViewModel _model;

    SomeView(MyPickerViewModel model) {  
        _model = model;

        _model.SelectionChanged += delegate(object s, EventArgs e) {   
            DoSomething();  
        }  

        _model.PrintWhetherSelectionChangedIsNull(); // prints "no"  
    }  

    private void DoSomething() { /* should be called now */ }  
}