2013-05-23 22 views
8

Tôi muốn sử dụng MVVMCross, tuy nhiên đối với ứng dụng Android của tôi, tôi cũng muốn sử dụng các thư viện khác (menu trượt và thanh tác vụ) yêu cầu tôi kế thừa các lớp hoạt động của mình từ lớp tùy chỉnh của họ. Điều này ngăn cản tôi từ kế thừa MvxActivity, nhưng tôi nhận thấy rằng trong MVVMCross dành cho iOS, bạn có thể làm tất cả những ràng buộc của bạn trong mã (xem https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-00-FirstDemo/FirstDemo.Touch/Views/FirstView.cs)MVVMCross cho android - làm thế nào để làm ràng buộc trong mã?

var set = this.CreateBindingSet<FirstView, FirstViewModel>(); 
set.Bind(textEditFirst).To(vm => vm.FirstName); 
set.Bind(textEditSecond).To(vm => vm.LastName); 
set.Bind(labelFull).To(vm => vm.FullName); 
set.Apply(); 

Có cách nào để làm điều đó trong Android?

Trả lời

11

Có - bạn có thể sử dụng liên kết linh hoạt trong Android nếu bạn muốn.

Chính xác cùng một mã sẽ hoạt động.

Bạn sẽ cần phải tham khảo các điều khiển ui bằng cách sử dụng FindViewById<Type>(), sau đó bạn có thể liên kết chúng.

Ví dụ, trong TipCalc bạn có thể thêm các điều khiển được xác định như sau:

<EditText 
     android:id="@+id/FluentEdit" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:textSize="24dp" 
     android:gravity="right" 
    /> 

và sau đó thực hiện ràng buộc sử dụng:

protected override void OnViewModelSet() 
    { 
     SetContentView(Resource.Layout.View_Tip); 

     var edit = this.FindViewById<EditText>(Resource.Id.FluentEdit); 

     var set = this.CreateBindingSet<TipView, TipViewModel>(); 
     set.Bind(edit).To(vm => vm.SubTotal); 
     set.Apply(); 

     // for non-default properties use 'For': 
     // set.Bind(edit).For(ed => ed.Text).To(vm => vm.SubTotal); 

     // you can also use: 
     // .WithConversion("converter", "optional parameter") 
     // .OneTime(), .OneWay() or .TwoWay() 
    } 

Ngoài ra, bạn có thể chuyển đổi bất kỳ FooActivity vào một liên kết dữ liệu MvxFooActivity bởi :

  • kế thừa từ FooActivity để cung cấp sự kiện từ các sự kiện lâu dài trong EventSo urceFooActivity
  • kế thừa từ EventSourceFooActivity để cung cấp một DataContext trong một MvxFooActivity
  • sau đó bạn có thể viết mã của bạn bên trong hoạt động kế thừa từ MvxFooActivity

Để xem, mã yêu cầu, xem:

Bạn sẽ thấy cùng một mã trong tất cả các Hoạt động được sửa đổi mvx - MvxActivity, MvxTabActivity, ... Có một ít cắt và dán ở đây, nhưng càng nhiều mã càng tốt được đặt trong các phương thức mở rộng dùng chung.

Trong các phiên bản trước, người ta đã sử dụng kỹ thuật này để ràng buộc monogame và google hoạt động quảng cáo - ví dụ như thấy Insert a Monogame view inside MvvmCross monodroid Activity

+1

Hi Stuart, tôi đang cố gắng phương pháp 1, nhưng nó đem lại cho vô ref ngoại lệ trên Bind() gọi . Tôi kế thừa hoạt động của mình từ Hoạt động, IMvxBindingContextOwner, IMvxLayoutInflater, IMvxView và tạo bối cảnh ràng buộc và xem bản thân mình. Lưu ý rằng kể từ khi tôi không thể kế thừa từ MvxActivity, tôi không thể gọi this.CreateBindingSet, tôi cũng phải tạo bản thân MvxAndroidBindingContext. Bất kỳ ý tưởng gì là sai? Nỗ lực của tôi để xem những gì đang xảy ra bằng cách biên dịch mã nguồn MVVMCross cũng không thành công, VS nói rằng nó không thể tải assembly system.windows.dll, mặc dù tôi đã loại bỏ ref trong Cirrious.CrossCore –

+0

Cách quá nhiều câu hỏi/bình luận trong bình luận cuối cùng. Tôi sẽ thay đổi 'cách khác' trong câu trả lời của tôi để bổ sung. Đối với tất cả mọi thứ khác trong bình luận đó, tôi không tham gia vào một cuộc trò chuyện bình luận - stackoverflow cau mày trên chúng. – Stuart