Передать объект в обработчике событий click/taped в Xamarin Forms

Вот мой рабочий класс:

public class Job
{
        public string Id{ get; set;}
        public string Name{ get; set;}
}

И вот мой ListView:

public class JobListePage:ContentPage
    {
        // Members
        private ListView lstView;

        // Constructor    
        public JobListePage ()
        {
            // Set members
            lstView = new ListView ();

            // Create job objects
            Job[] jobs = {new Job(){Id="1", Name="Benny"}, new Job(){Id="2", Name="Lukas"}};

            // Fill listview with job objects
            lstView.ItemsSource = jobs;

            // HOW CAN I PASS THE TAPPED OBJECT HERE???
            lstView.ItemTapped += async (o, e) => {
                await DisplayAlert("Tapped",  "HERE I WANT TO SHOW THE ID", "OK");
                ((ListView)o).SelectedItem = null; // de-select the row
            };

            ....

Теперь, как я могу передать выбранный «объект-задание» событию?

Вы можете видеть, что я показываю сообщение пользователю. И там же должен стоять ID тапнутого объекта.


person arnie    schedule 11.03.2015    source источник
comment
Вы можете просто использовать объект внутри лямбды. Это создаст замыкание, которое сохранит ссылку на него.   -  person JustSomeGuy    schedule 11.03.2015
comment
И название вводит в заблуждение, это не событие, а обработчик события.   -  person JustSomeGuy    schedule 11.03.2015
comment
@Spo1ler Я исправил заголовок. Спасибо.   -  person arnie    schedule 11.03.2015


Ответы (2)


пытаться:

        lstView.ItemTapped += async (o, e) => {
            var myList= (ListView)o;
            var myJob = (myList.SelectedItem as Job);
            await DisplayAlert("Tapped",  myJob.Id, "OK");
            myList.SelectedItem = null; // de-select the row
        };
person user1    schedule 11.03.2015
comment
Оно работает!!!!!! Что мне здесь не хватает? Содержит ли отправитель объект задания? А что ты делаешь? В ролях? Можете ли вы дать мне ссылку на статью, которая объясняет это? Большое спасибо! - person arnie; 11.03.2015
comment
это сочетание разных вещей. EventHandler отправляет object (o) и eventargs (e), в вашем случае отправитель o является ListView, поэтому вы должны привести объект к ListView, чтобы получить доступ к его свойствам. В этом случае нам нужно свойство SelectedItem, которое является Job, и снова мы приводим его (хотя я не уверен, что нам это нужно), а затем получаем доступ к свойству Job's Id это статья, объясняющая это (упаковка и распаковка) Если этот ответ помог вам, отметьте его как правильный ответ - person user1; 11.03.2015
comment
идеальное объяснение! тут больше нечего сказать - person arnie; 11.03.2015
comment
@ user1 Вы только что избавили меня от множества головных болей. Благодарю вас! - person derekmx271; 20.06.2017

На следующей странице объясняется, что именно вы ищете: Выбор элемента в ListView

listView.ItemSelected += async (sender, e) => 
{
    await DisplayAlert("Tapped!", (e.SelectedItem as Job).Id + " was tapped.", "OK");
};

Если вы хотите перейти на страницу сведений, передавая аргументы, используйте следующее:

listView.ItemSelected += async (sender, e) => 
{       
      var jobPage = new JobPage(e.SelectedItem as Job); // new page shows correct data          
      await Navigation.PushAsync(jobPage);
};
person Rohit Vipin Mathews    schedule 17.03.2015
comment
@arnie очень рад помочь - person Rohit Vipin Mathews; 17.03.2015