Вопрос по c# – MVVMCross Bindings в Android

5

Я разрабатываю кроссплатформенное приложение, запускающее его в Android. Я нашел ваш проект MVVMCross и пытаюсь в него попасть. Прямо сейчас я совершенно новичок в этом и не знаю, как связать мои результаты WebService с моим ListView. Вот немного XAML в качестве примера того, как я это пробую:

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

именно так выглядит

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

Когда я парю последние две строки, всплывающая подсказка говорит, что атрибут не объявлен. Я действительно не знаю, как ты это делаешь. Вы можете дать мне какой-то совет? Я думаю, что я должен написать некоторые XML в ценности моего проекта пользовательского интерфейса, верно?

Еще один вопрос: как я могу использовать AutoCompleteTextViews? Должен ли я сначала написать свои собственные MvXBindables для него? Любой совет? :-)

Я разделил вопросы. новая часть сейчас тамstackoverflow.com/questions/10511853/constructor-in-viewmodel Martin
Пожалуйста, задавайте один вопрос на каждый вопрос - это помогает в поиске проблем и ответов для других. Stuart

Ваш Ответ

1   ответ
5

вам нужно включить пространство имен - что, похоже, вы уже сделали.

Вам также необходимо включить файл MvxBindingAttributes.xml в ваш проект пользовательского интерфейса -https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/ResourcesToCopy/MvxBindingAttributes.xml - и вы должны установить действие сборки этого файла на «AndroidResource»

Для примера, посмотрите любой из примеров проектов Android -https://github.com/slodge/MvvmCross

Для второй части вашего вопроса о добавлении привязок инфраструктура привязки должна автоматически односторонним связыванием (от ViewModel до View) с существующими общедоступными свойствами в любом Monodroid View / виджете.

Если общедоступное свойство имеет неправильный тип (например, это некое перечисление Android вместо представления), то вы можете использовать IMvxValueConverter для выполнения преобразования.

Если вы хотите выполнить двухстороннее связывание или нет общедоступного свойства для того, к чему вы хотите привязать, тогда вы довольно легко сделаете настраиваемое связывание. Пример этого см. В пользовательской привязке IsFavorite 2 way вобразец конференции

Этот код добавляет новое привязываемое псевдо-свойство & quot; IsFavorite & quot; для каждой кнопки 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; }
    }
}
Error: User Rate Limit Exceeded Martin
Error: User Rate Limit Exceededjabbr.net/#/rooms/mvvmcross :)

Похожие вопросы