MvxAutoCompleteTextView

MvxAutoCompleteTextView

我正在使用Xamarin开发一个Android应用程序,并且为此使用了MVVMCross。
现在,我想使用MvxAutoCompleteTextView,但无法使其正常工作。

我做了一个样本,但无法正确获取

这是我的代码:
自动完成视图:

<Mvx.MvxAutoCompleteTextView
     android:id="@+id/actSignal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_margin="5dp"
     android:completionThreshold="1"
     local:MvxItemTemplate="@layout/searchitemview"
     local:MvxBind="ItemsSource Items; PartialText ItemSearchTerm; SelectedObject Item;" />


我使用的ItemView:

<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>


视图模型:

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",
            }
        };
    }
}


当我运行它并在其中键入内容时,我会在输出窗口中获得以下内容

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


这是我放置示例的github:Github

最佳答案

我做了一个样本,但无法正确获取


您应该在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>();
    }
}


效果:

android - 使MvxAutoCompleteTextView工作-LMLPHP

09-27 23:59