(MvvmCross.Logging.MvxLog) Не найдено сопоставление модели представления для представления кандидата RootActivity - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблема с привязкой в ​​формах MvvmCross и Xamarin. При переходе от моей MainViewModel к FileInfoViewModel я получаю следующую ошибку:

(MvvmCross.Logging.MvxLog) Не найдено ассоциаций модели представления для представления кандидата RootActivity

Я использовал настройку MvvmCross, как описано здесь

Это мой код RootActivity.cs в проекте Android:

    [Activity(Label = "XFCubage", Icon = "@mipmap/icon", Theme = "@style/MainTheme",
MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class RootActivity : MvxFormsAppCompatActivity<MvxFormsAndroidSetup<Core.App, App>, Core.App, App>
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        CrossCurrentActivity.Current.Activity = this;
        base.OnCreate(savedInstanceState);
    }
}

Это мой FileInfoViewModel.cs, по которому я перемещаюсь из MainViewModel (во время навигации я передаю объект InfoDetail):

namespace XFCubage.Core.ViewModels
{
    public class FileInfoViewModel : MvxViewModel<InfoDetail>
    {
        public ObservableCollection<SideMenuItem> MenuItems { get; set; }
        public InfoDetail Detail { get; private set; }
        public SideMenuItem SelectedMenuItem { get; set; }
        private int _sideMenuWidth;
        public int SideMenuWidth
        {
            get => _sideMenuWidth;
            set => SetProperty(ref _sideMenuWidth, value);
        }

        private IMvxNavigationService _navigationService;

        public FileInfoViewModel(IMvxNavigationService navigationService)
        {
            _navigationService = navigationService;

            InitializeSideMenuItems();

            CrossDeviceOrientation.Current.OrientationChanged += (sender, 
            args) =>
            {
                var orientation = args.Orientation;
                SetSideMenuWidth(orientation);
            };
        }


        void SetSideMenuWidth(DeviceOrientations orientation)
        {
            if (orientation == DeviceOrientations.Landscape || 
                orientation == DeviceOrientations.LandscapeFlipped)
                SideMenuWidth = 250;
            else
                SideMenuWidth = 65;
        }

        public void InitializeSideMenuItems()
        {
            MenuItems = new ObservableCollection<SideMenuItem>();
            MenuItems.Add(new SideMenuItem() { Id = 1, Title = "FILE INFO", ImageSource = ImageSource.FromFile("fileinfo.png"), Selected = true });
            MenuItems.Add(new SideMenuItem() { Id = 2, Title = "LOADING ADDRESS", ImageSource = ImageSource.FromFile("loadingaddress.png"), Selected = false });
            MenuItems.Add(new SideMenuItem() { Id = 3, Title = "DELIVERY ADDRESS", ImageSource = ImageSource.FromFile("deliveryaddress.png"), Selected = false });
            MenuItems.Add(new SideMenuItem() { Id = 4, Title = "QUOTE ADDRESS", ImageSource = ImageSource.FromFile("quoteaddress.png"), Selected = false });
            MenuItems.Add(new SideMenuItem() { Id = 5, Title = "BILLING ADDRESS", ImageSource = ImageSource.FromFile("wallet.png"), Selected = false });
            MenuItems.Add(new SideMenuItem() { Id = 6, Title = "ROOMS", ImageSource = ImageSource.FromFile("rooms.png"), Selected = false });
            MenuItems.Add(new SideMenuItem() { Id = 7, Title = "SUMMARY", ImageSource = ImageSource.FromFile("summary.png"), Selected = false });
            SelectedMenuItem = MenuItems[0];
        }

        public override void Prepare(InfoDetail parameter)
        {
            Detail = parameter;
        }
    }
}

Это мой FileInfoPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<views:MvxContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:views="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
    xmlns:components="clr-namespace:XFCubage.Core.Components;assembly=XFCubage.Core"
    xmlns:viewModels="clr-namespace:XFCubage.Core.ViewModels;assembly=XFCubage.Core"
    x:TypeArguments="viewModels:FileInfoViewModel"
    x:Class="XFCubage.Views.FileInfoPage"
    BackgroundColor="{StaticResource PageBackgroundColor}">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding SideMenuWidth}"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <listview:SfListView ItemsSource="{Binding MenuItems}" 
                         BackgroundColor="{StaticResource TableHeaderBackground}" 
                         ItemSpacing="0,10,0,10" 
                         SelectionMode="Single" SelectionGesture="Tap" SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay}">
        <listview:SfListView.ItemTemplate>
            <DataTemplate>
                <StackLayout Orientation="Horizontal">
                    <BoxView WidthRequest="3"/>
                    <Image Source="{Binding ImageSource}" WidthRequest="24" HeightRequest="24" Margin="10,0,20,0"/>
                    <Label Text="{Binding Title}" TextColor="{StaticResource TextColor}" VerticalTextAlignment="Center"/>
                </StackLayout>
            </DataTemplate>
        </listview:SfListView.ItemTemplate>
        <listview:SfListView.SelectedItemTemplate>
            <DataTemplate>
                <StackLayout Orientation="Horizontal" BackgroundColor="{StaticResource SelectedItemBackgroundColor}">
                    <BoxView WidthRequest="3" BackgroundColor="{StaticResource HighlightColor}"/>
                    <Image Source="{Binding ImageSource}" WidthRequest="24" HeightRequest="24" Margin="10,0,20,0"/>
                    <Label Text="{Binding Title}" TextColor="{StaticResource TextColor}" VerticalTextAlignment="Center"/>
                </StackLayout>
            </DataTemplate>
        </listview:SfListView.SelectedItemTemplate>
    </listview:SfListView>
</Grid>

Проблема возникает в этой строке в XAML bindin. Я получаю сообщение об ошибке:

(MvvmCross.Logging.MvxLog) Не найдено ассоциаций модели представления для представления кандидата RootActivity :

<ColumnDefinition Width="{Binding SideMenuWidth}"/>

Когда я изменяю эту строку на:

<ColumnDefinition Width="250"/>

Кажется, все в порядке. Странно то, что привязка для listview (модель Detail , которую я передаю из MainViewModel в FileInfoViewModel) работает.

Не могли бы вы помочь мне, потому что я в замешательстве.

1 Ответ

0 голосов
/ 12 ноября 2018

Согласно вашему коду, я не вижу, где вы связываете (data) ViewModel с (UI) FileInfoPagelian, я думаю, именно поэтому у вас появляется это сообщение об ошибке.

Обычно я создаю Xamarin.Form, пользовательский интерфейс находится в xxx.xaml, подключая Viewmodel в xxx.xaml.cs, например:

https://www.c -sharpcorner.com / статьи / Xamarin-формы создать-MVVM-привязки данных-приложение /

...