两个 ViewModel 使用一个模型来保存数据
Two ViewModels are using one Model which holds data
我搜索了将近 3 个小时,发现了很多关于 PRISM 和 VM 数据共享的内容,但我无法理解它。
我有两个 ViewModel MainViewModel 和 ListViewModel。 MainViewModel 有一个停靠面板,我想在其中有一个通用菜单来添加、删除项目和关闭应用程序等。 XAML 中还有一个显示 ListView 的用户控件。 ListView 包含几个 ObservableCollection<ProjectModel>
.
我想从 MainVM 添加更多项目 - 所以添加到一个集合中。为了访问包含数据的 ListModel,我将它传递给两个 ViewModel 的构造函数:
public MainModuleViewModel(ListModel listModel)
{
ListModel = listModel;
InitializeCommands();
}
public ListModuleViewModel(ListModel listModel)
{
ListModel = listModel;
InitializeCommands();
}
但似乎在初始化期间创建了不同的 ListModel 对象。
所以我的问题是:我必须做什么,才能只处理传递给构造函数的 ListModel 的一个对象?
一如既往,您有两个选择:
- 将
ListModel
注册为单例(ContainerControlledLifetimeManager
在 Unity 中)
- 或将服务注册为单例,将数据提供给视图模型
我会选择第二个,因为它更灵活 - 你可以在其他地方使用不同的 ListModel
实例来提供不同的内容,你可以让服务为每个视图模型提供它自己的实例(尽管具有相同的内容)或者你可以让它给每个视图模型相同的实例等等...
public interface IDatasource
{
ListModel Data { get; }
}
internal class StephensService : IDatasource
{
ListModel Data { get; } = new ListModel(); // or however you plan to procure the data
}
// ... bootstrapper / module initialization ...
Container.RegisterType<IDatasource, StephensService>( new ContainerControllerLifetimeManager() );
// ...
internal class ListModuleViewModel
{
public ListModuleViewModel( IDatasource datasource )
{
var heresMyData = datasource.Data;
}
}
根据您的需要,服务可以实现 INotifyPropertyChanged
或者 ListModel
可以是 ObservableCollection
...
我搜索了将近 3 个小时,发现了很多关于 PRISM 和 VM 数据共享的内容,但我无法理解它。
我有两个 ViewModel MainViewModel 和 ListViewModel。 MainViewModel 有一个停靠面板,我想在其中有一个通用菜单来添加、删除项目和关闭应用程序等。 XAML 中还有一个显示 ListView 的用户控件。 ListView 包含几个 ObservableCollection<ProjectModel>
.
我想从 MainVM 添加更多项目 - 所以添加到一个集合中。为了访问包含数据的 ListModel,我将它传递给两个 ViewModel 的构造函数:
public MainModuleViewModel(ListModel listModel)
{
ListModel = listModel;
InitializeCommands();
}
public ListModuleViewModel(ListModel listModel)
{
ListModel = listModel;
InitializeCommands();
}
但似乎在初始化期间创建了不同的 ListModel 对象。
所以我的问题是:我必须做什么,才能只处理传递给构造函数的 ListModel 的一个对象?
一如既往,您有两个选择:
- 将
ListModel
注册为单例(ContainerControlledLifetimeManager
在 Unity 中) - 或将服务注册为单例,将数据提供给视图模型
我会选择第二个,因为它更灵活 - 你可以在其他地方使用不同的 ListModel
实例来提供不同的内容,你可以让服务为每个视图模型提供它自己的实例(尽管具有相同的内容)或者你可以让它给每个视图模型相同的实例等等...
public interface IDatasource
{
ListModel Data { get; }
}
internal class StephensService : IDatasource
{
ListModel Data { get; } = new ListModel(); // or however you plan to procure the data
}
// ... bootstrapper / module initialization ...
Container.RegisterType<IDatasource, StephensService>( new ContainerControllerLifetimeManager() );
// ...
internal class ListModuleViewModel
{
public ListModuleViewModel( IDatasource datasource )
{
var heresMyData = datasource.Data;
}
}
根据您的需要,服务可以实现 INotifyPropertyChanged
或者 ListModel
可以是 ObservableCollection
...