пишу это музыкальное приложение, используя формы 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- Если я выберу любую песню для воспроизведения, она отобразится (значок паузы) для этого просмотра песни, а затем мне нужно сбросить все значки в списке песен на (Значок воспроизведения).как я могу перебрать элементы списка?есть ли способ реализовать это.?
кусок кода будет высоко ценится.спасибо