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

当我悬停最后两行时,工具提示说属性未声明。我真的不知道你是怎么做到的。你能给我一些建议吗?我想我必须在我的 UI 项目的 Values 中写一些 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


对于关于添加绑定的问题的第二部分,绑定框架应自动单向绑定(从 ViewModel 到 View)到任何 Monodroid 视图/小部件上的现有公共属性。

如果公共属性的类型不正确(例如,它是一些 Android 枚举而不是视图),那么您可以使用 IMvxValueConverter 进行转换。

如果您想进行双向绑定,或者没有要绑定的公共属性,那么您很容易进行自定义绑定。有关这方面的示例,请参阅会议示例中的自定义 IsFavorite 2 方式绑定

此代码为每个 Android Button 添加了一个新的可绑定伪属性“IsFavorite”。

...这是在 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 回答