2014-01-13 4 views
1

Я создал собственный элемент управления numbpad для ios и теперь попытаюсь связать его с MVVMCross с моей ViewModel. Но это не работает, значение всегда равно null в ViewModel.Пользовательский контроль привязки не работает

Кодекса является цифровым блоком:

[Register("NumberPad")] 
public partial class NumberPad : UIView 
{ 

    public string Text { 
     get; 
     set; 
    } 


    public NumberPad(IntPtr h): base(h) 
    { 
     //SetUp();   
    } 

    public NumberPad (RectangleF frame) : base(frame) 
    { 
     SetUp(); 

    } 

    public NumberPad() 
    {   
     //SetUp();   
    } 

    void SetUp() 
    { 
     var arr = NSBundle.MainBundle.LoadNib ("NumberPad", this, null); 
     var v = Runtime.GetNSObject (arr.ValueAt (0)) as UIView; 
     v.Frame = new RectangleF (0, 0, Frame.Width, Frame.Height); 
     AddSubview (v); 

     Number0.TouchUpInside += HandleTouchUpInside; 
     Number1.TouchUpInside += HandleTouchUpInside; 
     Number2.TouchUpInside += HandleTouchUpInside; 
     Number3.TouchUpInside += HandleTouchUpInside; 
     Number4.TouchUpInside += HandleTouchUpInside; 
     Number5.TouchUpInside += HandleTouchUpInside; 
     Number6.TouchUpInside += HandleTouchUpInside; 
     Number7.TouchUpInside += HandleTouchUpInside; 
     Number8.TouchUpInside += HandleTouchUpInside; 
     Number9.TouchUpInside += HandleTouchUpInside; 

    } 

    void HandleTouchUpInside (object sender, EventArgs e) 
    { 
     int tag = ((UIButton)sender).Tag; 

     if (tag >= 0 && tag <= 9) { 
      Text = String.Format("{0}{1}",Text,tag); 
     } else if (tag == 10 && Text.Length > 0) { 
      Text = Text + Text.Substring (0, Text.Length - 1); 
     } 
    } 
} 

И Binding так:

set.Bind(numberPad).For(vm => vm.Text).To (vm => vm.Password); 

Любые идеи?

ответ

2

Если вы хотите MvvmCross автоматически подобрать изменения свойства, как:

public string Text { 
    get; 
    set; 
} 

, то вы должны дать MvvmCross каким-то образом зная, что свойство изменилось значение. Самый простой способ сделать это, чтобы просто обеспечить событие с условным названием и поднять эти изменения, когда изменения текста - например:

public event EventHandler TextChanged; 

private string _text; 
public string Text { 
    get { return _text; } 
    set { _text = value; TextChanged.Raise(this); } 
} 

Более подробную информацию о пользовательских элементов управления и пользовательских привязок, см N = 18, 19 , 20 и 28 в http://mvvmcross.blogspot.co.uk/

Смежные вопросы