2017-08-01 1 views
0

Je travaille sur une application Android avec Xamarin et j'utilise MVVMCross pour cela. Maintenant, je veux utiliser le MvxAutoCompleteTextView mais je n'arrive pas à le faire fonctionner.Obtenir MvxAutoCompleteTextView au travail

J'ai fait un échantillon et ne peut pas l'obtenir correctement

suit Voici mon code: La vue autocomplete:

<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;" /> 

Le ItemView J'utilise:

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

Le viewmodel:

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

Quand je le lance et tapez quelque chose dans ce que je reçois le texte suivant dans la fenêtre de sortie

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

C'est le github où je mets mon échantillon: Github

+0

Voici un exemple sur la façon d'utiliser [MvxAutoCompleteTextView] (https://github.com/JimWilcox3/MvxAutoCompleteTest). –

+0

J'ai déjà vu cet exemple a cherché une erreur que j'ai faite mais je ne peux pas en trouver. – kevingoos

+0

Modifier le code dans ce projet, quand je n'utilise pas 'MvxItemTemplate' pour' MvxAutoCompleteTextView' tout fonctionne bien, y a-t-il un problème? –

Répondre

1

J'ai fait un échantillon et ne peut pas obtenir correctement

Vous devez implémenter l'interface INotifyPropertyChanged dans ItemClass classe, code complet comme celui-ci:

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)); 
     } 
    } 
} 

Je veux utiliser un modèle personnalisé avec plus d'informations, seul le nom.

Utilisez un modèle personnalisé pour MvxAutoCompleteTextView:

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

En searchitemview.axml, les propriétés de liaison que vous avez difine dans votre ItemClass classe:

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

utiliser dans votre classe 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>(); 
    } 
} 

Effet:

enter image description here