Доступ к управлению изображением внутри шаблона элемента списка с помощью форм MVVM, Xamarin - PullRequest
0 голосов
/ 21 сентября 2019

пишу это музыкальное приложение, используя формы Xamarin, архитектуру MVVM.Итак, в основном у меня есть список исполнителей, каждый из которых имеет список песен.

Представление песни, которое является itemTemplate в SongListView, имеет элемент управления изображением, который воспроизводит / останавливает песню.Я добавил распознаватель жестов для изображения и связал его с моделью представления, командой для изображения LoadSongCommand следующим образом:

ViewModel

 private async void ExecuteLoadSongCommand(string url)
    {

        MainPage._SoundControl.IsVisible = true;


        if (MediaManager.CrossMediaManager.Current.State == MediaManager.Player.MediaPlayerState.Playing)
        {

            await MediaManager.CrossMediaManager.Current.Pause();
            SoundControlView._ImagePlay.Source = "play.png";
        }
        else
        {

            await MediaManager.CrossMediaManager.Current.Play(url);
            SoundControlView._ImagePlay.Source = "pause.png";


        }
    }

Мой XAML:

<ListView x:Name="SongsListView"
              ItemsSource="{Binding Songs}"
              HasUnevenRows="True"
              SeparatorVisibility="None"
              BackgroundColor="Transparent">
        <ListView.ItemTemplate>
            <DataTemplate>
                <mt1:MtViewCell >
                <Frame Margin="20,5"
                       Padding="2">
                    <StackLayout Margin="0">
                        <Grid HorizontalOptions="FillAndExpand"
                              VerticalOptions="FillAndExpand">
                            <Grid.ColumnDefinitions>

                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />


                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="*" />

                            </Grid.RowDefinitions>
                            <Frame Grid.Column="2"
                                   Grid.Row="0"
                                   Grid.RowSpan="2"
                                   BorderColor="Green"
                                   CornerRadius="1"
                                   IsClippedToBounds="True"
                                   Padding="0"
                                   Margin="0"
                                   HeightRequest="30"
                                   WidthRequest="30"
                                   HorizontalOptions="CenterAndExpand"
                                   VerticalOptions="CenterAndExpand">
                                <Image BackgroundColor="Transparent"
                                       Source="a1.png"
                                       HorizontalOptions="CenterAndExpand"
                                       VerticalOptions="CenterAndExpand" />
                            </Frame>
                            <Label Grid.Column="1"
                                   FlowDirection="RightToLeft"
                                   Grid.Row="0"
                                   Text="Title"
                                   FontAttributes="Bold"
                                   FontSize="14"
                                   BackgroundColor="Transparent"
                                   TextColor="#252121" />
                            <Label Grid.Column="1"
                                   FlowDirection="RightToLeft"
                                   Grid.Row="1"
                                   Text=""
                                   FontAttributes="Bold"
                                   FontSize="8"
                                   BackgroundColor="Transparent"
                                   TextColor="#676767" />



                            <Image Grid.Column="0"
                                   Grid.Row="0"
                                   Grid.RowSpan="2"
                                   Source="play.png"
                                   HorizontalOptions="Center"
                                   VerticalOptions="Center"
                                   x:Name="ViewImagePlay"
                                   x:FieldModifier="public"
                                   BackgroundColor="Transparent"
                                   HeightRequest="40"
                                   WidthRequest="40" >
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer  
                                        Command="{Binding BindingContext.LoadSongCommand, Source={Reference SongsListView }}"
                                                             CommandParameter="{Binding Url}" >

                                    </TapGestureRecognizer>

                                </Image.GestureRecognizers>

                            </Image>




                        </Grid>

                    </StackLayout>
                </Frame>
                </mt1:MtViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>


    </ListView>

при нажатии / остановке воспроизведения / остановки я могу затем изменить значок в SoundControlView (это абсолютный макет, который всегда отображается на экране, когда воспроизводится какая-либо музыка, он показывает то же состояние, что текущая музыка воспроизводится / останавливается).

Теперь проблема заключается в следующем: 1 - если я коснусь кнопки воспроизведения / остановки любого listViewItem, я могу изменить значок в SoundControlView, потому что я могу получить доступ к SoundControlView через его x: Name, но яне может сделать обратное.то есть, если я нажимаю кнопку воспроизведения / остановки в SoundControlView, я не могу получить доступ к шаблону элемента, который выдал эту команду, чтобы изменить его значок.

Я хочу просто использовать MVVM и привязку, я не хочу использоватьобработчики событий.

2- Если я выберу любую песню для воспроизведения, она отобразится (значок паузы) для этого просмотра песни, а затем мне нужно сбросить все значки в списке песен на (Значок воспроизведения).как я могу перебрать элементы списка?есть ли способ реализовать это.?

кусок кода будет высоко ценится.спасибо

...