【发布时间】:2026-01-13 07:20:06
【问题描述】:
在以下情况下,我无法确定最佳解决方案。我正在使用 Prism 4.1、MEF 和 .Net 4.0。
我有一个对象Project,它可能有大量(~1000)个Line 对象。我正在决定是否最好从我的ProjectViewModel 公开ObservableCollection<LineViewModel> 并在那里手动创建 Line 视图模型,或者将 ListBox 设置为它自己的区域并以这种方式激活视图。
我仍然希望我的LineViewModel 能够注入 Prism 的共享服务(IEventAggregator 等),但是当我手动创建 LineViewModel 时我不知道该怎么做。有什么建议或想法吗?
编辑:我最初的想法:
项目:
public class Project
{
public List<Line> Lines { get; set; }
}
ProjectViewModel:
[Export(typeof(ProjectViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ProjectViewModel : NotificationObject, IRegionMemberLifetime
{
private Project _localProject;
/*
HERE WILL BE SOME PROPERTIES LIKE COST, PRICE THAT ARE CUMULATIVE FROM THE Lines
*/
public ObservableCollection<LineViewModel> Lines { get; private set; }
private readonly IEventAggregator _eventAggregator;
[ImportingConstructor]
public ProjectViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.GetEvent<ProjectLoaded>().Subscribe(SetupProject, false);
Lines = new ObservableCollection<LineViewModel>();
}
private void SetupProject(Project project)
{
_localProject = project;
foreach(var l in _localProject.Lines)
{
LineViewModel lvm = new LineViewModel(l);
lvm.PropertyChanged += // Some handler here
Lines.Add(lvm);
}
}
public bool KeepAlive
{
get { return false; }
}
}
LineViewModel:
public class LineViewModel : NotificationObject
{
private Line _localLine;
public decimal Cost
{
get { return _localLine.Cost; }
set
{
_localLine.Cost = value;
RaisePropertyChanged(() => Cost);
}
}
public LineViewModel(Line incoming)
{
_localLine = incoming;
}
}
【问题讨论】:
-
啊,我明白了。它看起来不错,也许你应该继续前进,看看它是如何运作的。至于使用 DI,只需将 LineViewModel 更改为具有 Line 属性,而不是在构造函数中传递它。使用容器解析 LineViewModel(因此获取注入的依赖项),然后设置 LineViewModel.Line = l;你应该很高兴。