2012-05-08 30 views
5

Tôi đang phát triển một ứng dụng đa nền tảng bắt đầu nó trong Android. Tôi đã tìm thấy dự án MVVMCross của bạn và tôi đang cố gắng để có được nó. Ngay bây giờ tôi hoàn toàn mới với nó và không biết làm thế nào để ràng buộc các kết quả WebService của tôi vào ListView của tôi. Dưới đây là một chút của XAML làm ví dụ làm thế nào tôi đang cố gắng nó:MVVMCross Bindings trong Android

xmlns:mobsales="http://schemas.android.com/apk/res/MobSales.DroidUI" 
... 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_marginLeft="5dp" 
mobsales:MvxItemTemplate="@layout/listitem_customer" 
mobsales:MvxBind="{'ItemSource':{'Path':'Customer'}}" /> 
... 

chính xác trông như thế này

<cirrious.mvvmcross.binding.android.views.MvxBindableListView 
     android:id="@+id/autocomplete" 
     android:layout_below="@id/txtfield" 
     android:layout_centerHorizontal="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     mobsales:MvxItemTemplate="@layout/listitem_customer" 
     mobsales:MvxBind="{'ItemSource':{'Path':'Customers'}}" /> 

Khi tôi đang lơ lửng hai dòng cuối cùng các tooltip nói thuộc tính không được công bố. Tôi thực sự không biết làm thế nào bạn làm điều này. Bạn có thể cho tôi một lời khuyên? Tôi nghĩ rằng tôi phải viết một số xml trong các giá trị của dự án giao diện người dùng của tôi, phải không?

Một câu hỏi khác: Làm cách nào để sử dụng AutoCompleteTextViews? Tôi có phải viết MvXBindables của riêng mình trước cho nó không? Lời khuyên nào? :-)

+0

Xin hỏi một câu hỏi mỗi câu hỏi - điều này giúp với tìm kiếm các vấn đề và câu trả lời cho người khác. – Stuart

+1

Tôi đã tách các câu hỏi. phần mới bây giờ đã qua đó http://stackoverflow.com/questions/10511853/constructor-in-viewmodel – Martin

Trả lời

5

Để các thuộc tính này ràng buộc bạn cần phải bao gồm không gian tên - có vẻ như bạn đã hoàn thành.

Bạn cũng cần phải bao gồm các tập tin MvxBindingAttributes.xml vào dự án giao diện người dùng của bạn - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/ResourcesToCopy/MvxBindingAttributes.xml - và bạn phải thiết lập xây dựng hành động của tập tin này để "AndroidResource"

Đối với một ví dụ, thấy bất kỳ của các dự án mẫu Android - https://github.com/slodge/MvvmCross


Đối với phần thứ hai của câu hỏi của bạn về các ràng buộc thêm, khuôn khổ ràng buộc sẽ tự động một chiều bind (từ ViewModel để xem) để tính công cộng hiện có trên bất kỳ Monodroid Xem/widget.

Nếu thuộc tính công khai không thuộc loại chính xác (ví dụ: một số liệt kê Android thay vì Chế độ xem), thì bạn có thể sử dụng IMvxValueConverter để thực hiện chuyển đổi.

Nếu bạn muốn thực hiện liên kết 2 chiều, hoặc không có thuộc tính công khai cho những gì bạn muốn liên kết, thì bạn khá dễ dàng thực hiện một ràng buộc tùy chỉnh. Để biết ví dụ về điều này, hãy xem liên kết IsFavorite 2 cách tùy chỉnh trong the conference sample

Mã này thêm thuộc tính giả mạo mới "IsFavorite" vào mọi Nút Android.

... này được khởi tạo trong Setup.cs sử dụng mã như:

protected override void FillTargetFactories(MvvmCross.Binding.Interfaces.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry) 
    { 
     base.FillTargetFactories(registry); 

     registry.RegisterFactory(
        new MvxCustomBindingFactory<Button>(
         "IsFavorite", 
         (button) => new FavoritesButtonBinding(button))); 
    } 

... và mã ràng buộc là:

public class FavoritesButtonBinding 
    : MvxBaseAndroidTargetBinding 
{ 
    private readonly Button _button; 
    private bool _currentValue; 

    public FavoritesButtonBinding(Button button) 
    { 
     _button = button; 
     _button.Click += ButtonOnClick; 
    } 

    private void ButtonOnClick(object sender, EventArgs eventArgs) 
    { 
     _currentValue = !_currentValue; 
     SetButtonBackground(); 
     FireValueChanged(_currentValue); 
    } 

    public override void SetValue(object value) 
    { 
     var boolValue = (bool)value; 
     _currentValue = boolValue; 
     SetButtonBackground(); 
    } 

    private void SetButtonBackground() 
    { 
     if (_currentValue) 
     { 
      _button.SetBackgroundResource(Resource.Drawable.star_gold_selector); 
     } 
     else 
     { 
      _button.SetBackgroundResource(Resource.Drawable.star_grey_selector); 
     } 
    } 

    protected override void Dispose(bool isDisposing) 
    { 
     if (isDisposing) 
     { 
      _button.Click -= ButtonOnClick; 
     } 
     base.Dispose(isDisposing); 
    } 

    public override Type TargetType 
    { 
     get { return typeof(bool); } 
    } 

    public override MvxBindingMode DefaultMode 
    { 
     get { return MvxBindingMode.TwoWay; } 
    } 
} 
+0

Cảm ơn câu trả lời này! bạn đã giúp tôi rất nhiều! – Martin

+0

Cool - mọi yêu cầu thêm tại đây hoặc trên http://jabbr.net/#/rooms/mvvmcross :) – Stuart

Các vấn đề liên quan