1
votes

Using Xamarin.Android with MVVMCross. When Select the value from MVXSpinner that Not Binding to SelectedYear Property in the Model. When Load the page debugger comes in to SelectedYear Property, But When I select the value from spinner it want comes into SelectedYear. I haven't get any errors. Please Any one Advice me where I am wrong.

Found Binding Issue on Output Window

MvxBind:Warning:228.30 Failed to create target binding for binding SelectedItem for SelectedYear [0:] MvxBind:Warning:228.30 Failed to create target binding for binding SelectedItem for SelectedYear 11-09 11:50:03.756 I/mono-stdout(32419): MvxBind:Warning:228.30 Failed to create target binding for binding SelectedItem for SelectedYear

   <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:orientation="vertical"
        android:layout_alignParentRight="true"
        android:layout_marginRight="50dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/Retread.Collection.UI.DroidPhone.DotYear"
            style="@style/LabelTextView" />
        <MvxSpinner
            android:id="@+id/txtYear"
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:overlapAnchor="false"
            local:MvxItemTemplate="@drawable/year_spinner"
            local:MvxDropDownItemTemplate="@drawable/year_spinnerdropdown"
            android:hint="@string/Retread.Collection.UI.DroidPhone.Year"
            local:MvxBind="ItemsSource Year;SelectedItem SelectedYear"
            style="@style/AppSpinnerStyle" />

Year_spinner.xml File below.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:local="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dip"
        android:singleLine="true"
        android:textColor="#000000"
        local:MvxBind="Text DisplayYear"/>

Year_spinnerdropdown.xml file Below.

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:background="#ffffff"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:ellipsize="marquee"
    local:MvxBind="Text DisplayYear" />

In View Model I have Following Properties. And In the Year Model I have a Property DisplayYear.

 private List<YearModel> _Year;
            public List<YearModel> Year
            {
                get
                {
                    return _Year;
                }
                set
                {
                    _Year = value;
                    RaisePropertyChanged(() => Year);
                }
            }

       public YearModel SelectedYear
        {
            get
            {
                return Model.SelectedYear;
            }
            set
            {
                Model.SelectedYear = value;
                RaisePropertyChanged(() => SelectedYear);
            }
        }
2
You are not making yourself clear what is wrong here. What is the expected result? What do you see? Why is it wrong? - Cheesebaron
The expected result is when I post the form I need the binding value(selected Value) in SelectedYear Property. But I haven't get any values(null) in SelectedYear Property. What I See is When I Select a value from Dropdown No event triggered into ViewModel to SelectedYear Property. I haven't know where I let mistake. - Dino
Show us your YearModel code. - PmanAce

2 Answers

2
votes

Maybe if I post something that works for me it can point you in the right direction.

Spinner:

<Mvx.MvxSpinner
    style="@style/spinner"
    android:background="@drawable/spinner_selector"
    local:MvxItemTemplate="@layout/item_spinner"
    local:MvxBind="ItemsSource Position; SelectedItem SelectedPosition"
    android:id="@+id/positionSpinner" />

MvxItemTemplate:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    style="@style/Spinner.MyPlayers"
    android:singleLine="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/dummy_title"
    local:MvxBind="Text Caption" />

ViewModel:

protected int SelectedPositionId
{
    get { return SelectedPosition == null ? 1 : SelectedPosition.Index; }
}

protected SpinnerItem _selectedPosition;
public virtual SpinnerItem SelectedPosition
{
    get { return _selectedPosition; }
    set 
    { 
        if (_selectedPosition != value)
        {
            _selectedPosition = value;

            SettingsPreferences.SelectedPosition = SelectedPositionId;

            RebuildLists(true);

            RaisePropertyChanged(() => SelectedPosition);
            RaisePropertyChanged(() => DisplayCleanSheets);
            RaisePropertyChanged(() => FilteredPlayers);
        }
    }
}

List<SpinnerItem> _position;
public List<SpinnerItem> Position
{
    get 
    { 
        if (_position != null)
            return _position; 

        _position = new List<SpinnerItem>();

        var values = (int[])Enum.GetValues(typeof(PositionEnumeration));

        foreach (var val in values.Where(p => p > 0))
            _position.Add(new SpinnerItem(val, SharedTextSource.GetText(Enum.GetName(typeof(PositionEnumeration), val))));

        return _position;
    }
}

SpinnerItem:

public class SpinnerItem
{
    public SpinnerItem(int index, string caption, int primaryKeyId = 0, string tag = "")
    {
        Index = index;
        Caption = caption;
        PrimaryKeyId = primaryKeyId;
        Tag = tag;
    }

    public int Index { get; private set; }

    public string Caption { get; private set; }

    public string Tag { get; private set; }

    public int PrimaryKeyId { get; private set; }

    public override string ToString()
    {
        return Caption;
    }

    public override bool Equals(object obj)
    {
        var rhs = obj as SpinnerItem;

        if (rhs == null)
            return false;

        return rhs.Caption == Caption;
    }

    public override int GetHashCode()
    {
        return Caption == null ? 0 : Caption.GetHashCode();
    }
}
1
votes

Answer here https://github.com/MvvmCross/MvvmCross-AndroidSupport/issues/80

You'll need to call MvxAppCompatSetupHelper.FillTargetFactories from your Setup.cs. Maybe there's a way we can automate that via the plugin architecture?