让MvxAutoCompleteTextView工作

时间:2017-08-01 12:55:50

标签: android xamarin xamarin.android mvvmcross

我正在使用Xamarin的Android应用程序,我使用MVVMCross。 现在我想使用MvxAutoCompleteTextView,但我无法让它工作。

我制作了一个样本,无法正确使用

以下是我的代码: 自动填充视图:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    local:cardCornerRadius="2dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp">
        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="20sp"
            local:MvxBind="Text Name" />
    </RelativeLayout>
</android.support.v7.widget.CardView>

我使用的ItemView:

public class FirstViewModel : MvxViewModel
{
    private ObservableCollection<ItemClass> _items;
    private ItemClass _item;
    private string _searchTerm;

    public ObservableCollection<ItemClass> Items
    {
        get => _items;
        set => SetProperty(ref _items, value);
    }

    public ItemClass Item
    {
        get => _item;
        set => SetProperty(ref _item, value);
    }

    public string ItemSearchTerm
    {
        get => _searchTerm;
        set => SetProperty(ref _searchTerm, value);
    }

    public FirstViewModel()
    {
        Init();
    }

    private void Init()
    {
        Items = new ObservableCollection<ItemClass>
        {
            new ItemClass
            {
                Name = "Test1",
            },
            new ItemClass
            {
                Name = "Test2",
            },
            new ItemClass
            {
                Name = "Test3",
            }
        };
    }
}

viewmodel:

[0:] mvx:Diagnostic: 15.18 Wait starting for T

当我运行它并输入内容时,我会在输出窗口中显示以下内容

bootstrap collapse

这是我放样本的github:Github

1 个答案:

答案 0 :(得分:2)

  

我制作了一个样本,无法正确使用

您应该在INotifyPropertyChanged类中实现ItemClass接口,完整代码如下:

public class ItemClass : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            this.RaisePropertyChanged("Name");
        }
    }

    private int _age;
    public int Age
    {
        get
        {
            return _age;
        }
        set
        {
            _age = value;
            this.RaisePropertyChanged("Age");
        }
    }

    public override string ToString()
    {
        return "Age is " + Age + ", Name is " + Name;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null))
        {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}
  

我想使用包含更多信息的自定义模板,然后只使用名称。

使用MvxAutoCompleteTextView的自定义模板:

 <MvxAutoCompleteTextView
      ...
      local:MvxItemTemplate="@layout/searchitemview"
      local:MvxBind="ItemsSource Items; PartialText CurrentTextHint; SelectedObject SelectedObject;" />

searchitemview.axml中,您ItemClass类中已有的绑定属性:

<LinearLayout
  ...
  <TextView
      ...
      local:MvxBind="Text Name" />
  <TextView
      ...
      local:MvxBind="Text Age" />
 </LinearLayout>

FirstViewModel课程中使用它:

public class FirstViewModel : MvxViewModel
{
    private static ObservableCollection<ItemClass> AutoCompleteList;

    public FirstViewModel()
    {
        AutoCompleteList = new ObservableCollection<ItemClass>()
         {
             new ItemClass
             {
                 Name = "Test1",
                 Age = 11
             },
             new ItemClass
             {
                 Name = "Test2",
                 Age = 12
             },
             new ItemClass
             {
                 Name = "Test3",
                 Age = 13
             }
        };
    }

    private ItemClass _SelectedObject;
    public ItemClass SelectedObject
    {
        get { return _SelectedObject; }
        private set
        {
            _SelectedObject = new ItemClass { Name = value.Name ,Age = value.Age};
            RaisePropertyChanged("SelectedObject");
        }
    }

    private List<ItemClass> _items = new List<ItemClass>();
    public List<ItemClass> Items
    {
        get
        {
            if (_items == null)
            {
                _items = new List<ItemClass>();
            }
            return _items;
        }
        set { _items = value; RaisePropertyChanged("Items"); }
    }

    private string _currentTextHint;
    public string CurrentTextHint
    {
        get
        { return _currentTextHint; }
        set
        {
            MvxTrace.Trace("Partial Text Value Sent {0}", value);
            //Setting _currentTextHint to null if an empty string gets passed here
            //is extremely important.
            if (value == "")
            {
                _currentTextHint = null;
                SetSuggestionsEmpty();
                return;
            }
            else
            {
                _currentTextHint = value;
            }

            if (_currentTextHint.Trim().Length < 2)
            {
                SetSuggestionsEmpty();
                return;
            }

            var list = AutoCompleteList.Where(i => (i.Name.ToString() ?? "").ToUpper().Contains(_currentTextHint.ToUpper()));
            if (list.Count() > 0)
            {
                Items = list.ToList();
            }
            else
            {
                SetSuggestionsEmpty();
            }
        }
    }

    private void SetSuggestionsEmpty()
    {
        Items = new List<ItemClass>();
    }
}

效果:

here