5

私はAndroidでそれを開始するクロスプラットフォームアプリを開発しています。私はあなたのMVVMCrossプロジェクトを見つけました、そして私はそれに取り掛かろうとしています。今のところ、私はまったく新しいので、WebService-ResultsをListViewにバインドする方法がわかりません。ここに、私がどのように試しているかの例として、XAMLを少し示します。

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'}}" /> 
...

まさにこのように見えます

<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'}}" />

最後の2行にカーソルを合わせると、ツールチップに属性が宣言されていないと表示されます。私はあなたがこれをどのように行うのか本当にわかりません。アドバイスをいただけますか?UIプロジェクトの値にxmlを記述しなければならないと思いますよね?

別の質問:AutoCompleteTextViewsをどのように使用できますか?最初に独自のMvXBindablesを作成する必要がありますか?何かアドバイス?:-)

4

1 に答える 1

5

これらの属性をバインドするには、名前空間を含める必要があります。これは完了したようです。

また、MvxBindingAttributes.xml ファイルを UI プロジェクトに含める必要があります ( https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/ResourcesToCopy/MvxBindingAttributes.xml) このファイルのビルドアクションを「AndroidResource」に

例については、Android サンプル プロジェクトのいずれかを参照してください - https://github.com/slodge/MvvmCross


バインディングの追加に関する質問の 2 番目の部分については、バインディング フレームワークは、任意の Monodroid ビュー/ウィジェットの既存のパブリック プロパティに (ViewModel からビューへ) 一方向に自動的にバインドする必要があります。

パブリック プロパティが正しいタイプでない場合 (たとえば、View ではなく Android 列挙型である場合)、IMvxValueConverter を使用して変換を行うことができます。

双方向バインディングを行いたい場合、またはバインド先のパブリック プロパティがない場合は、カスタム バインディングをかなり簡単に行うことができます。この例については、カンファレンス サンプルのカスタム IsFavorite 2 ウェイ バインディングを参照してください。

このコードは、新しいバインド可能な疑似プロパティ「IsFavorite」をすべての Android ボタンに追加します。

...これは、次のようなコードを使用して Setup.cs で初期化されます。

    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)));
    }

...そしてバインディングコードは次のとおりです。

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; }
    }
}
于 2012-05-08T09:00:06.587 に答える