Neat Machine
Neat Machine

Reputation: 711

MVVMCross Android List Item Property Binding

I've got the exact same (like, I've diffed them looking for a typo) thing working on different lists in the same application. Does anyone know why my list item properties won't bind?

ViewModel - This seems to be working fine. I'm getting the correct number of rows, and I can see these ItemViewModels on the ItemSelected command. Therefore, the block below appears to be in working order:

public ObservableCollection<ItemViewModel> Items
{
    get { return _items; }
    set
    {
        _items= value;
        RaisePropertyChanged(() => Items);
    }
}

<namespace.MyListView
    android:id="@+id/my_list"
    android:layout_below="@+id/toolbar_title"
    android:layout_marginTop="30dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    local:MvxItemTemplate="@layout/my_item_rowlayout"
    local:MvxBind="ItemsSource Items; ItemClick ItemSelectedCommand;" />

ItemViewModel - I can see these on the table's ItemSelected command, but none of the properties will bind to the layout.

    public string Path
    {
        get { return _path; }
        set
        {
            _path = value;
            RaisePropertyChanged(() => Path);
        }
    }

    public ItemViewModel()
    {
        Path = "some value";
    }


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">

    <TextView
      android:id="@+id/item_textview"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textSize="15dp"
      android:textColor="@android:color/black"
      tools:text="test text"
      android:singleLine="true"
      android:textStyle="normal"
      local:MvxBind="Text Path" />
</LinearLayout>

While debugging MyListView, I can use GetChildAt to observe views that look like this:

base = {MvvmCross.Binding.Droid.Views.MvxBaseListItemView}
+       base    {Android.Widget.FrameLayout}    Android.Widget.FrameLayout
-       BindingContext  {MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext}   MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext
-       DataContext {Namespace.ItemViewModel}   Namespace.ItemViewModel

All of my properties are in there.

ListView:

[Android.Runtime.Preserve(AllMembers = true)]
public class MyListView: MvxListView
{
    public MyListView(Context context, IAttributeSet attrs)
        : base(context, attrs)
    {

    }

}

From output:

    MvxBind:Error: 20.30 Problem parsing binding MvxException: Cannot terminate binding expression during option Path in Text Path
      at MvvmCross.Binding.Parse.Binding.MvxBindingParser.ParseEquals (System.String block) [0x00008] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\MvxBindingParser.cs:80 
  at MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseNextBindingDescriptionOptionInto (MvvmCross.Binding.Parse.Binding.MvxSerializableBindingDescription description) [0x00091] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:39 
  at MvvmCross.Binding.Parse.Binding.Tibet.MvxTibetBindingParser.ParseNextBindingDescriptionOptionInto (MvvmCross.Binding.Parse.Binding.MvxSerializableBindingDescription description) [0x0002e] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\Tibet\MvxTibetBindingParser.cs:49 
  at MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseBindingDescription (MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser+ParentIsLookingForComma parentIsLookingForComma) [0x0000c] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:195 
  at MvvmCross.Binding.Parse.Binding.Swiss.MvxSwissBindingParser.ParseBindingDescription () [0x00000] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\Swiss\MvxSwissBindingParser.cs:178 
  at MvvmCross.Binding.Parse.Binding.MvxBindingParser.ParseTargetPropertyNameAndDescription () [0x0000c] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\MvxBindingParser.cs:73 
  at MvvmCross.Binding.Parse.Binding.MvxBindingParser.TryParseBindingSpecification (System.String text, MvvmCross.Binding.Parse.Binding.MvxSerializableBindingSpecification& requestedBindings) [0x00015] in D:\git\MvvmCross\MvvmCross\Core\Binding\Parse\Binding\MvxBindingParser.cs:52 

Upvotes: 0

Views: 312

Answers (1)

Neat Machine
Neat Machine

Reputation: 711

After getting a hint to look at the output log, I found an exception and after a bit of searching it seems to have occurred when trying to use reserved keywords. "Path" is reserved, changing the property name resolved the issue.

Looking at the output log is key...

Upvotes: 1

Related Questions