如何将MvxContentView绑定到DataTemplate中的数据,并让MvvmCross为此加载ViewModel?

问题描述

我有一个带有CollectionView的MvxContentPage。 CollectionView中的项目将与MvxContentView一起呈现。我已经尝试了很多,但是无法获取MvxContentView来加载它的关联viewmodel。我已经下载了MvvmCross代码并查看了示例。 PlayGround项目中有一个示例,但似乎不完整。

下面的页面显示了Set的内容一个Set包含 n SetItems,这些应该显示在CollectionView中。每个SetItem均使用部分视图显示

这是我的代码

MvxContentPage:

<?xml version="1.0" encoding="utf-8" ?>
<mvx:MvxContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:mvx="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
    xmlns:views="clr-namespace:eTabber.Views"
    xmlns:model="clr-namespace:eTabber.Data.Model;assembly=eTabber.Data"
    xmlns:viewmodels="clr-namespace:eTabber.Core.viewmodels;assembly=eTabber.Core"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Padding="0"
    x:Class="eTabber.Views.SetView" x:TypeArguments="viewmodels:Setviewmodel"
    Title="{Binding PageTitle}" >

    <StackLayout
        StyleClass="MainContainer"
        Spacing="0"
        Margin="0"
        Padding="0">
        <Grid>
            <Grid.ColumnDeFinitions>
                <ColumnDeFinition Width="*"/>
            </Grid.ColumnDeFinitions>

            <Grid.RowDeFinitions>
                <RowDeFinition Height="auto" />
                <RowDeFinition Height="auto" />
                <RowDeFinition Height="*" />
            </Grid.RowDeFinitions>

            <Label Text="{Binding SetList.Name,Mode=OneWay}" StyleClass="Title" Grid.Row="0"></Label>
            <StackLayout Orientation="Vertical" Grid.Row="1">
                <Button Text="Add" Command="{Binding AddCommand}" />
                <CollectionView ItemsSource="{Binding SetItems}" 
                                HorizontalOptions="FillAndExpand"
                                VerticalOptions="FillAndExpand"
                                x:Name="SetlistsListView"
                                Grid.Row="2"
                                SelectionMode="Single"
                                ChildrenReordered="SetlistsListView_ChildrenReordered">
                    <CollectionView.ItemTemplate>
                        <DataTemplate x:DataType="model:SetItem" x:Name="DataTemplate">
                            <views:SetItemView BindingContext="{Binding Source={x:Reference DataTemplate}}" />
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </StackLayout>
        </Grid>
    </StackLayout>
</mvx:MvxContentPage>

以及带有MvxContentView的部分视图:

<?xml version="1.0" encoding="UTF-8"?>
<mvx:MvxContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:mvx="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:viewmodels="clr-namespace:eTabber.Core.viewmodels;assembly=eTabber.Core"
             x:TypeArguments="viewmodels:SetItemviewmodel"
             x:Class="eTabber.Views.SetItemView">
    <ContentView.Content>
        <Grid x:Name="SetlistsInnerView" RowSpacing="0">
            <Grid.RowDeFinitions>
                <RowDeFinition/>
                <RowDeFinition/>
            </Grid.RowDeFinitions>
            <Label Text="{Binding Set.SetName,Mode=OneWay}"
                                       IsVisible="{Binding TitleVisible,Mode=OneWay}"
                                       StyleClass="Title"
                                       Grid.Row="0">
            </Label>
            <Grid>
                <Grid.ColumnDeFinitions>
                    <ColumnDeFinition Width="*"/>
                    <ColumnDeFinition Width="2*"/>
                </Grid.ColumnDeFinitions>

                <Label Text="{Binding Path=Song.Artist.Name,Mode=OneWay}" Grid.Column="0" Grid.Row="0" StyleClass="Label"/>
                <Label Text="{Binding Path=Song.Title,Mode=OneWay}" Grid.Column="1" Grid.Row="0" StyleClass="Label"/>
            </Grid>
        </Grid>
    </ContentView.Content>
</mvx:MvxContentView>

后面的代码

using eTabber.Core.viewmodels;
using MvvmCross.Forms.Views;
using Xamarin.Forms.Xaml;

namespace eTabber.Views
{
    [XamlCompilation(XamlCompilationoptions.Compile)]
    public partial class SetItemView : MvxContentView<SetItemviewmodel>
    {
        public SetItemView()
        {
            InitializeComponent();
        }
    }
}

viewmodel:

using eTabber.Data.Model;
using MvvmCross.Navigation;
using Xamarin.Forms;

namespace eTabber.Core.viewmodels
{
    public class SetItemviewmodel : Baseviewmodel<SetItem>
    {
        public SetItem SetItem { get => passedEntity; set => passedEntity = value; }

        public SetItemviewmodel(IMvxNavigationService navigationService) : base(navigationService)
        {
            var context = View.BindingContextProperty;
        }
    }
}

它确实显示了带有信息的页面,因此正在进行一些绑定,但是我希望它加载viewmodel(在这种情况下,绑定当然必须有所不同)。显示内容如下:

enter image description here

问题在第一个MvxContentPage代码中:

我在绑定中指定什么来获取要加载的SetItemviewmodel。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)