2010-10-13 19 views
0

我有一个UIPickerViewModel它应该触发一个事件,当它的选定的值发生变化时,但在调用Selected时,EventHandler为空。代码(有些简化):在显示组件后,C#/ MonoTouch EventHandler变为null;代表失踪?

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为空再次成为前非空。

我猜我已经添加到EventHandler的代表正在收集垃圾或其他东西,但这只是一个猜测。任何人都可以指出我对C#/ iOS对象生命周期的一个很好的入门知识吗?

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

回答

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 */ } 
}