Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin表单中,如果已经来自父listview,如何将子集合传递到新页面以在listview中使用?_C#_Listview_Xamarin.forms - Fatal编程技术网

C# 在Xamarin表单中,如果已经来自父listview,如何将子集合传递到新页面以在listview中使用?

C# 在Xamarin表单中,如果已经来自父listview,如何将子集合传递到新页面以在listview中使用?,c#,listview,xamarin.forms,C#,Listview,Xamarin.forms,下面是一个场景。我有一个父列表视图,其模型包含另一个集合,我希望在单击标签时将其传递到另一个页面,以便在另一个列表视图中使用 父视图模型如下所示: public ObservableCollection<Songs> JazzCollection { get; set; } public RecordsViewModel() { JazzCollection = new ObservableCollection<Songs>();

下面是一个场景。我有一个父列表视图,其模型包含另一个集合,我希望在单击标签时将其传递到另一个页面,以便在另一个列表视图中使用

父视图模型如下所示:

    public ObservableCollection<Songs> JazzCollection { get; set; }
    public RecordsViewModel()
    {
        JazzCollection = new ObservableCollection<Songs>();
        var playlist = new Songs
        {
            Station = "Jazz Legends",
            Artists = new ObservableCollection<Artist>
            {
                new Artist
                {
                    ArtistID = 0,
                    Name = "John Coltrane",
                    Song = "Giant Steps"
                },
                new Artist
                {
                    ArtistID = 1,
                    Name = "Miles Davis",
                    Song = "So What"
                },
                new Artist
                {
                    ArtistID = 2,
                    Name = "Blue Mitchell",
                    Song = "Kinda Blue"
                },
            },
            Title = "Click here to see artists in playlist"
        };
        JazzCollection.Add(playlist);

        var anotherPlaylist
            .
            .
            .
        JazzCollection.Add(anotherPlaylist);
    }
publicobservableCollection JazzCollection{get;set;}
公共记录viewmodel()
{
JazzCollection=新的ObservableCollection();
var playlist=新歌曲
{
Station=“爵士传奇”,
艺术家=新的可观察集合
{
新艺术家
{
ArtistID=0,
Name=“John Coltrane”,
宋=“大步”
},
新艺术家
{
ArtistID=1,
Name=“迈尔斯·戴维斯”,
宋=“那又怎样?”
},
新艺术家
{
ArtistID=2,
Name=“Blue Mitchell”,
宋=“有点蓝”
},
},
Title=“单击此处查看播放列表中的艺术家”
};
JazzCollection.Add(播放列表);
另一个播放列表
.
.
.
JazzCollection.Add(另一个播放列表);
}
现在,父XAML是:

<ListView x:Name="RecordsListView"
          SeparatorVisibility="None"
          HasUnevenRows="true"
          ItemsSource="{Binding JazzCollection}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding Station}"/>
                    <!--WHEN THEY CLICK ON THIS TITLE BELOW
                        I'D LIKE THEM TO GO TO A NEW PAGE LISTING
                        THE ARTISTS IN THIS STATION. HOW DO I
                        BIND THE ARTISTS ObservableCollection TO
                        THE NEW PAGE? -->
                    <Label Text="{Binding Title}"/>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

listview显示的父对象没有任何问题,但我很难将子集合“Artisters”发送到新页面中用作BindingContext。有什么办法吗

下面是我计划为新的页面视图模型所做的工作,但我不确定它是否正确

public class ArtistViewModel
{
    public ObservableCollection<Artist> Artists { get; set; }
    public ArtistViewModel(ObservableCollection<Artist> artists)
    {
        Artists = artists;
    }
}
公共类ArtistViewModel
{
公共可观测集合艺术家{get;set;}
公共ArtistViewModel(可观察收集艺术家)
{
艺术家=艺术家;
}
}

然后我会在第二页的新列表视图中使用“艺术家”作为项目源。

ItemSelected
处理程序添加到
ListView

void OnSelection (object sender, SelectedItemChangedEventArgs e)
{
  if (e.SelectedItem == null) {
    return; //ItemSelected is called on deselection, which results in SelectedItem being set to null
  }

  // get the selected Songs object
  var songs = (Songs)e.SelectedItem;

  // pass the Artists collection to the next page
  Navigation.PushAsync(new ArtistsPage(songs.Artists));
}

答案是一个TapGestureRecognizer,但命令中还需要包含一些其他内容,才能使其正常工作,因为它包含在ListView中。它应该是这样的:

<Label.GestureRecognizers>
      <TapGestureRecognizer
            Command="{Binding Path=BindingContext.TapCommand, Source={x:Reference JazzCollection}}"
            CommandParameter="{Binding Comments}"
            NumberOfTapsRequired="1"/>
</Label.GestureRecognizers>

需要注意的一点是,x:Reference JazzCollection指的是为ContentPage指定的名称。必须将其添加到顶级XML标记:x:Name=“JazzCollection”。这是我用作参考的答案的链接。请参阅JamesMontemagno的评论,下面是大约10条评论

参考资料:


取决于您在新页面上创建视图模型的方式,或者您使用的框架和viewcontructors@Saruman我根据你的要求编辑了这篇文章。你只是在用pushasync打开新页面吗?@Saruman是的。这就是计划!谢谢你的帮助!我们快到了。如果我希望在单击整个ListView项目时进行导航,那么这是可行的。我只希望当我点击“标题”标签时,这个动作才会发生,因为我最终会让电台标签也可以点击,并且我希望它转到一个单独的页面。想法?您必须将TapGestureRecognitor附加到标签上,并在上下文中传递。只需使用一个按钮可能会容易得多-然后您可以在CommandParameterThank you@Jason中传递上下文。我现在正在修补它。你能不能顺便附上一个例子?我也会处理它,如果我让它工作起来,我会发布它<代码>你所做的应该是有效的。您对它有问题吗?当您单击它时,什么都没有发生,因为它位于listview中。我之前发布的方式只在ListView之外有效。将发布答案和解决方案的参考。谢谢你的帮助!你提供了宝贵的提示。