Pytanie Xamarin Forms ListView ItemTapped / ItemSelected Command Binding na XAML


Jak mogę powiązać obiekt ICommand z mojego ViewModel (obecnie w BindingContext) z ItemTapped lub ItemSelected z ListView w XAML?

Jest to proste zadanie przy użyciu przycisku, po prostu ustawię Command = "MyViewModelCommand" i wszystko działa.


14
2017-07-17 00:23


pochodzenie


nie ma sposobu na powiązanie ListView SelectedItem do właściwości w ViewModel? to zwykle robisz w innych frameworkach opartych na XAML, takich jak WPF. Nie miałem szansy dostać się w ręce Xamarin.Forms jeszcze haha - Federico Berasategui
Tak ... Mogę łatwo wiązać właściwości, ale polecenia wydają się być trochę trudne. Mogę powiązać właściwość SelectedItem, ale nie mogę znaleźć sposobu powiązania zdarzenia "SelectedItemChanged". - MarcioGomes
zwykle śledzę, otrzymuję dane w kodzie za, otrzymuję wybrany element i przekazuję go do ViewModel, jak ten ListView ls = new ListView (); l .ItemSelected + = (obiekt nadawca, SelectedItemChangedEventArgs e) => {var param1 = e.SelectedItem; var currentVm = this.BindingContext jako YourViewModel; currentVm.MethodName (param1); }; - KirtiSagar
Cześć KirtiSagar, Robię jak ty ... Używam kodu z tyłu, aby obsłużyć zdarzenie SelectedItemChange, ale w XAML (WPF lub Windows Phone) mogę powiązać zdarzenie bezpośrednio z ViewModel - MarcioGomes


Odpowiedzi:


Nie jestem pewien, dlaczego chcesz umieścić wydarzenie Item Selected lub Item Tapped na swojej stronie, kiedy możesz bezpośrednio pobrać zaznaczony / wybrany obiekt bezpośrednio w swoim ViewModelu:

Myślę, że powiązałeś listę z poniższymi typami kodu

<ListView ItemsSource="{Binding PermitDetails}" 
SelectedItem="{Binding objItemSelected, Mode=TwoWay}" x:Name="lst" 
RowHeight="35" HorizontalOptions="FillAndExpand" 
VerticalOptions="Fill">

W modelu widoku powiązanym ze stroną musisz zdefiniować tę właściwość objItemSelected jak wspomniano w poniższym kodzie

private Permit _ItemSelected;
public Permit objItemSelected {
    get {
        return _ItemSelected;
    }
    set {
        if (_ItemSelected != value) {
            _ItemSelected = value;
            OnPropertyChanged ("ItemSelected");
        }
    }
}

A jeśli chcesz wykonać dodatkowe funkcje, takie jak nawigowanie po stronie szczegółów, możesz to zrobić z zestawu właściwości po wykonaniu instrukcji OnPropertyChanged.

Mam nadzieję że to pomoże!


20
2017-10-15 13:23



Cześć Nirav, muszę wyzwolić komendę VM w SelectedItem Event, aby nie tylko wysłać wybraną wartość pozycji do maszyny wirtualnej. - MarcioGomes
Widzę, co robisz. Bardzo mądry. Używanie obserwowalnego setera właściwości jako procedury obsługi zdarzenia Command. Miły. To dostaje mój głos. - Rod Hartzell
To świetny sposób, aby ułatwić wybór i pracować na wszystkich platformach w przeciwieństwie do klasycznego podejścia do zdarzeń SelectedItem! - Aziris Morora
Im ustawienie Moje ItemSource do mojej listy i "objItemSelected" do mojej klasy, ale pojawia się ten błąd: Nie można rzucić obiekt typu "Xamarin.Forms.Xaml.ElementNode" do typu "Xamarin.Forms.Xaml.ValueNode" - thatsIT
Znalazłem mój problem. Wybrałem ItemSelected zamiast SelectedItem! - thatsIT


Moim scenariuszem jest klawiatura, obrazy są przyciskami, a po kliknięciu odpowiedni znak pojawia się na etykiecie.

Więc..

Powiedzmy, że masz następującą kontrolkę (klawisz 1):

<Image  x:Name="imgKey1"
        Source="key1.png"
        Aspect="AspectFit" />

I chcesz, gdy obraz jest dotknięty, aby wywołać polecenie z obiektu "viewModel". Mój "viewModel" ma następującą właściwość:

public ICommand AddCharCommand { protected set; get; }

gdzie w moim konstruktorze klasy (widoku modelu) mam:

  this.AddCharCommand = new Command<string>((key) =>
            {
                // Add the key to the input string.
                this.InputString += key;
            });

"InputString" jest właściwością łańcucha ...

Więc do wiązania widoku i trybu, ja robię następujące:

  imgKey1.GestureRecognizers.Add(new TapGestureRecognizer
        {
            Command = viewModel.AddCharCommand,
            CommandParameter = "1",
        });

Mam nadzieję, że ci pomogę, jeśli ktoś czegoś potrzebuje i ja mogę pomóc; Jestem tutaj ... i tam. JJ

IN XAML 17-11-14

      <Image  Source="n1normal.png"
              Aspect="AspectFit" >
        <Image.GestureRecognizers>
          <TapGestureRecognizer
            Command="{Binding AddCharCommand}"
            CommandParameter ="1"/>
        </Image.GestureRecognizers>
      </Image>

//-OR-

        <Image Source="magnifyglass.png"
               Aspect="AspectFit"
               HorizontalOptions="End">
          <Image.GestureRecognizers>
            <TapGestureRecognizer Tapped="Search"/>
          </Image.GestureRecognizers>  
        </Image>

//And for the Search create in your ViewModel

 private void Search(object sender, EventArgs e)
 {
      //Your code here
 }

2
2017-08-07 12:16



Cześć, to rozwiązanie działa wspaniale przy wiązaniu polecenia programowo, ale czy wiesz jak to zrobić w XAML? - MarcioGomes
Myślę, że do tej pory działa na WinPhone. Jeśli zdarzenie ItemSelected lub ItemTapped zostało powiązane z ListView. Ponieważ mam z tym problem - AEMLoviji
"MarcioGomes" przykro mi z powodu opóźnienia. Zamieszczam rozwiązanie w XAML ... jeśli jeszcze go nie znalazłeś. - JohnnyJaxs


Kiedyś stosowałem podejście wiążące wybrany element do modelu widoku, ale to zwykle powodowało problemy podczas filtrowania programowych zmian w porównaniu do działań użytkownika. Moim osobistym faworytem jest dołączona własność.

public static readonly BindableProperty ListItemTappedCommandProperty = BindableProperty.CreateAttached<AttachedProperties, ICommand>(
    staticgetter: o => (ICommand) o.GetValue(ListItemTappedCommandProperty), 
    defaultValue: default(ICommand),
    propertyChanged: (o, old, @new) =>
    {
        var lv = o as ListView;
        if (lv == null) return;

        lv.ItemTapped -= ListView_ItemTapped;
        lv.ItemTapped += ListView_ItemTapped;
    });

private static void ListView_ItemTapped(object sender, object item)
{
    var lv = sender as ListView;

    var command = (ICommand) lv?.GetValue(ListItemTappedCommandProperty);
    if (command == null) return;

    if (command.CanExecute(item))
        command.Execute(item);
}

... a następnie ustawić ListView za pomocą:

controls:AttachedProperties.ListItemTappedCommand="{Binding ItemSelectedCommand}"

Możliwe, że można by nawet rozszerzyć tę nazwę i zastosować ją bardziej ogólnie, ale jest to ćwiczenie na inny czas.


1
2017-09-17 04:40





Dlaczego nie powiązać atrybutu selectedItem widoku listy z właściwością viewModel (powiedzmy właściwość selectedEtem); następnie na seter dla właściwości selectedindture w swoim widokuModel wykonujesz polecenie.

Spójrz na komentarz Michaela Rumplera w sekcji komentarzy tego artykuł


0
2017-08-14 17:19



Nie widzę żadnych komentarzy do tego artykułu. Ponadto, gdy podasz link, zawsze najlepiej jest podać rzeczywisty cytat z niego. - Keith Pinson