У меня проблема с привязкой в формах 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) работает.
Не могли бы вы помочь мне, потому что я в замешательстве.