gpt4 book ai didi

c# - MvxException : Failed to construct and initialize ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:26:20 25 4
gpt4 key购买 nike

我正在尝试使用 ShowViewModel<ViewModel, Type>(parameter) 在同一 View 模型(递归)的不同实例之间传递对象列表作为参数.
我的 MVVMCross/xamarin 表单项目中出现此错误。

 MvvmCross.Platform.Exceptions.MvxException: Failed to construct and 
initialize ViewModel for type Project.Core.ViewModels.ObjectViewModel from locator MvxDefaultViewModelLocator - check InnerException for more information ---> MvvmCross.Platform.Exceptions.MvxException: Problem creating viewModel of type ObjectViewModel ---> MvvmCross.Platform.Exceptions.MvxIoCResolveException: Failed to resolve parameter for parameter obj of type ObjectItem when creating Project.Core.ViewModels.ObjectViewModel
at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.GetIoCParameterValues (System.Type type, System.Reflection.ConstructorInfo firstConstructor) [0x00036] in C:\projects\mvvmcross\MvvmCross\Platform\Platform\IoC\MvxSimpleIoCContainer.cs:502
at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.IoCConstruct (System.Type type) [0x0002c] in C:\projects\mvvmcross\MvvmCross\Platform\Platform\IoC\MvxSimpleIoCContainer.cs:312
at MvvmCross.Platform.Mvx.IocConstruct (System.Type t) [0x00006] in C:\projects\mvvmcross\MvvmCross\Platform\Platform\Mvx.cs:169
at MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load (System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00000] in C:\projects\mvvmcross\MvvmCross\Core\Core\ViewModels\MvxDefaultViewModelLocator.cs:33

为了解释更多,这是我的代码:

ObjectPage.xaml
<mvx:MvxContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:mvx="clr-namespace:MvvmCross.Forms.Core;assembly=MvvmCross.Forms"
x:Class="Project.Core.Pages.ObjectPage"
Title="Object">
<StackLayout>
<StackLayout>
<StackLayout Padding="5,5,5,5">
<Label Text="{Binding SubTitle}" FontSize="21" VerticalOptions="End"></Label>
</StackLayout>
<StackLayout>
<ListView
ItemsSource="{Binding ObjectItems}"
SelectedItem="{Binding SelectedListItem, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Frame HasShadow="True" Margin="10">
<StackLayout Margin="8">
<Label Text="{Binding Title}"></Label>
</StackLayout>
</Frame>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</StackLayout>

ObjectPage.xaml.cs
namespace Project.Core.Pages
{
public partial class ObjectPage
{
public ObjectPage (ObjectItem obj)
{
InitializeComponent ();
BindingContext = new ObjectViewModel(obj);
}
}
}

对象 View 模型
namespace Project.Core.ViewModels
{
public class ObjectViewModel : ObjectItemViewModel
{

public ObjectViewModel(ObjectItem obj) : base(obj)
{
}

public override void ShowItem()
{
ShowViewModel<ObjectViewModel, ObjectItem>(Obj);
}
}
}

解释更多:每个对象都有一个 ObjectItems 列表。每个 ObjectItem 也有一个 ObjectItem 列表。
对象继承自 ObjectItem。
这是一个例子:
Objects = new List<Object>
{
new Object
{
Title = "Title",
SubTitle="subtitle",
ObjectItems = new List<ObjectItem>
{
new ObjectItem{Title = "title goes here" },
new ObjectItem{Title = "another objectItem title"},
}
}
}

为了加载这些项目,我创建了一个类 View 模型,ObjectViewModel 从中继承

ObjectItemViewModel.cs
 namespace Project.Core.ViewModels
{
public class ObjectItemViewModel : MvxViewModel<ObjectItem>
{
public string Title => (this.Obj == null ? "/!\\ Titre" : this.Obj.Title);
public string SubTitle => (this.Obj == null ? "/!\\ Sous Titre" : this.Obj.SubTitle);
private List<ObjectItemViewModel> _ObjectItems;
public List<ObjectItemViewModel> ObjectItems
{
get => _ObjectItems;

set
{
_ObjectItems = value;
RaisePropertyChanged(() => ObjectItems);
}
}
private ObjectItem _Obj;
public ObjectItem Obj
{
get => _Obj;
set
{
_Obj= value;
RaisePropertyChanged(() => Obj);
}
}
public ObjectItemViewModel _selectedListItem;
public ObjectItemViewModel SelectedListItem
{
get
{
return _selectedListItem;
}
set
{
if (SetProperty(ref _selectedListItem, value))
OnSelectedChangedCommand.Execute(value);
}
}

public ObjectItemViewModel(ObjectItem obj)
{
this.Obj = obj;
loadItems();
}

private MvxCommand<ObjectItemViewModel> _onSelectedChangedCommand;

private ICommand OnSelectedChangedCommand
{
get
{
return _onSelectedChangedCommand ?? (_onSelectedChangedCommand = new MvxCommand<ObjectItemViewModel>((item) =>
{
if (item == null)
{
Debug.WriteLine("Item null");

return;
}
item.ShowItem();
}));
}
}


public virtual void ShowItem()
{
//DO nothing


}

public void loadItems()
{
if (this.Obj != null &&
this.Obj.ObjectItems != null &&
this.Obj.ObjectItems.Count > 0)
{
ObjectItems = new List<ObjectItemViewModel>();
foreach (ObjectItem objectItem in this.Obj.ObjectItems)
{
if (objectItem.MemoItems != null && objectItem.ObjectItems.Count == 1)
{
ObjectItems.Add(new InfoViewModel(objectItem));
}
else
{

ObjectItems.Add(new ObjectViewModel(objectItem));
Debug.WriteLine("Item crée" + objectItem.Title);
}
}

}
}

public override Task Initialize(ObjectItem parameter)
{
Obj = parameter;
return Task.FromResult(0);

}
}
}

最佳答案

您放入 ViewModel 的 ctor 中的所有内容,MvvmCross 都将其视为需要通过依赖注入(inject)获得的东西。所以在你的情况下,因为 ObjectItem未在 MvvmCross IoC 容器中注册,ShowViewModel无法解析并放入构造函数。

通常如何解决这个问题,是使用 Init您的 ViewModel 中的方法而是将对象作为 ShowViewModel 中的参数传递称呼。

如果您使用 MvvmCross 5.x 或更新版本,它已移至 Initialize , 当使用新的 NavigationService ,但基本内容或多或少是相同的。

我认为在您的情况下,最快的解决方法是在您的 ObjectViewModel 中添加一个空构造函数。 .然后添加 Init方法,您可以在其中分配 Obj支持并调用 loadItems()类似于非空ctor。所以像:

public class ObjectItemViewModel : MvxViewModel<ObjectItem>
{
public ObjectItemViewModel() { }

public void Init(ObjectItem obj)
{
Obj = obj;
loadItems();
}

// rest of code
}

ObjectItemViewModel 中删除 ctor ,然后制作 ObjectViewModel这:
public class ObjectViewModel : ObjectItemViewModel
{
public override void ShowItem()
{
ShowViewModel<ObjectViewModel, ObjectItem>(Obj);
}
}

关于c# - MvxException : Failed to construct and initialize ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com