Получение значения ListView выбранного элемента в Xamarin.Forms - PullRequest
0 голосов
/ 08 июня 2018

Я занимаюсь разработкой / изучением XamarinForms.Я использую Web Api, чтобы получить значения и использовать их для заполнения ListView.Теперь я хочу получить текущие значения на ItemSelected и сохранить их для последующего использования, но, похоже, мне это не удается.Я использую MVVM.

Это мой ListView

<ListView x:Name="ProfileDetails" ItemsSource="{Binding Profiles}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout  Margin="20,0,0,0" Orientation="Horizontal" HorizontalOptions="FillAndExpand">
                     <Label Text="{Binding ProfileType}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand" TextColor="LightGray"/>
                    <Label Text="{Binding ProfileChamber}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand"  TextColor="LightGray"/>
                    <Label Text="{Binding ProfileWidhtMM}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand" TextColor="LightGray"/>
                    <Label Text="{Binding ProfilePrice}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand"  TextColor="LightGray"/>
                 </StackLayout>
             </ViewCell>
         </DataTemplate>
     </ListView.ItemTemplate>                
 </ListView>

Это ViewModel

APIServices _apiServices = new APIServices();


private List<Profile> _profiles;

public List<Profile> Profiles
{
    get { return _profiles; }
    set
    {
        _profiles = value;
        OnPropertyChanged();
    }
}


public ICommand GetProfilesCommand
{
    get
    {
        return new Command(async () =>
        {
            Profiles = await _apiServices.GetProfilesAsync(_accessToken);
        });
    }
}

И это мой запрос API

public async Task<List<Profile>> GetProfilesAsync(string accessToken)
{
    var client = new HttpClient();

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    var json = await client.GetStringAsync(Constants.GetProfilesUrl);
    var profiles = JsonConvert.DeserializeObject<List<Profile>>(json);
    return profiles;
}

А это Модель

public long Id { get; set; }
public string ProfileType { get; set; }
public int ProfileChamber { get; set; }
public int ProfileWidhtMM { get; set; }
public double ProfilePrice { get; set; } 

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Ответ от Oluwasayo правильный, но я вижу, что вы уже используете MVVM, так что использование этого решения может быть лучше для вас, на тот случай, если вы хотите сохранить свой класс code-behind чистым и оставить все смешанные code-behind и ViewModelкод для одной функциональности.

Я не знаю, используете ли вы какой-то фреймворк MVVM или нет, но есть очень хороший и полезный behavior, называемый EventToCommandBehavior, который вы можете использовать для "перевода" любогособытие и связать его с командой в вашей ViewModel.

Вы можете найти реализацию этого здесь на GitHub, вы можете легко включить его в свой проект.Существует множество других реализаций из сред MVVM.

Шаги, чтобы сделать это так, как я вам советую:

  1. Включите этот класс в свой проект, и вы сможетеиспользуйте его на страницах xaml.

  2. Отредактируйте код VM и добавьте несколько дополнительных строк кода.

Код модели представления:

// Property for binding SelectedItem from ListView.
private Profile _selectedProfile;
public Profile SelectedProfile
{
    get { return _profiles; }
    set
    {
        _selectedProfile= value;
        OnPropertyChanged();
    }
}

// Command which we will use for Event to Command binding.
public DelegateCommand ItemTappedCommand{ get; private set; }

// ...
// Code inside of the ctor in VM:
ItemTappedCommand = new Command(ItemTapped);
// ...

// Method which will be executed using our command
void ItemTapped()
{
    // Here you can do whatever you want, this will be executed when
    // user clicks on item in ListView, you will have a value of tapped
    // item in SlectedProfile property
}
Отредактируйте код своей страницы XAML и добавьте несколько строк кода.

Страница XAML:

<!-- In your page xaml header add xaml namespace to EventToCommandBehaviour class-->
xmlns:b="clr-namespace:Namespace.ToYour.EventToCommandBehaviourClass"

<ListView x:Name="ProfileDetails" ItemsSource="{Binding Profiles}"
          SelectedItem={Binding SelectedProfile}>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Margin="20,0,0,0" Orientation="Horizontal" HorizontalOptions="FillAndExpand">
                    <Label Text="{Binding ProfileType}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand" TextColor="LightGray"/>
                    <Label Text="{Binding ProfileChamber}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand"  TextColor="LightGray"/>
                    <Label Text="{Binding ProfileWidhtMM}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand" TextColor="LightGray"/>
                    <Label Text="{Binding ProfilePrice}" VerticalTextAlignment="Center" HorizontalOptions="StartAndExpand"  TextColor="LightGray"/>
                  </StackLayout>
              </ViewCell>
          </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.Behaviors>
        <b:EventToCommandBehavior EventName="ItemTapped" 
                                  Command="{Binding ItemTappedCommand}" />
    </ListView.Behaviors>               
</ListView>

Надеюсь, что это имеет смысл для вас, при использовании этого подхода ваш код позадикласс останется чистым, не смешивая код между vm и code-behind, просто мой совет для вас.

Желаю вам удачи с кодированием!

0 голосов
/ 09 июня 2018

В вашем xaml добавьте свойство ItemTapped.Может быть:

ItemTapped="ProfileDetails_Selected"

Тогда у вас должен быть метод для обработки события в вашем коде:

private void ProfileDetails_Selected(object sender, ItemTappedEventArgs e)
    {
       var myItem = e.Item ...; //from here you can get your item and store for later use
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...