首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棱镜:使用多个ViewModels优先查看

棱镜:使用多个ViewModels优先查看
EN

Stack Overflow用户
提问于 2016-07-23 21:24:02
回答 1查看 1.4K关注 0票数 0

我在一个WPF项目中使用Prism和Unity IOC-Container。对于我的所有其他视图,每个视图只使用一个ViewModel。因为这个视图应该是数据输入和输出的掩码,所以我想使用两个ViewModels。

对于视图的当前导航,我使用以下代码:

代码语言:javascript
复制
_regionManager.RequestNavigate(RegionNames.ContentRegionName, typeof(Events).ToString());`

my View背后的代码:

代码语言:javascript
复制
public partial class Events : UserControl
{
    public Events(EventsViewModel viewModel)
    {
        InitializeComponent();
    }
}

其中一个ViewModels:

代码语言:javascript
复制
public class EventsViewModel : BindableBase
{
    public EventsViewModel()
    {
       // Some Code
    }
   // Some other Code
}

我听说过ViewModel发现,你给视图的构造函数一个接口,而不是一个实际的ViewModel。但我只能找到这么多信息。

代码语言:javascript
复制
// Example of such a Method
public Events(IViewModel viewModel)
{
    InitializeComponent();
    DataContext = viewModel
}

public Interface IViewModel
{

}

我现在的问题是:我如何导航到视图并告诉它应该以DataContext的形式获取ViewModel?我对编程和MVVM模式比较陌生,而且英语不是我的母语,所以我可能错过了一些信息。如果有人对此有答案,我会很高兴的。提前谢谢。

编辑:解决方法

我想出了一个对我有效的变通办法。我使用了ViewModelLocationProvider中的SetDefaultViewTypeToViewModelTypeResolver()方法并对其进行了自定义。

代码语言:javascript
复制
// Bootstrapper.cs
protected override void InitializeShell()
{
    var window = (MainWindow)this.Shell;
    Application.Current.MainWindow = window;

    // Calling the method
    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(ResolveViewModel);
    var regionManager = Container.Resolve<IRegionManager>();

    window._regionManager = regionManager;
    globalRegionManager = regionManager;

    regionManager.RegisterViewWithRegion(RegionNames.ContentRegionName, typeof(StartScreen));
    regionManager.RegisterViewWithRegion(RegionNames.ContentRegionName, typeof(Stock));

    window.Show();
}

// Property for handing over the desired ViewModel
public static Type DynamicViewModel { private get; set; }

private Type ResolveViewModel (Type viewType)
{
    string _viewModel = null;
    var name = viewType.FullName.Replace(".Views.", ".ViewModels.");

    if (DynamicViewModel != null)
        _viewModel = DynamicViewModel.ToString();
    else
        _viewModel = $"{name}ViewModel";

    var fullName = IntrospectionExtensions.GetTypeInfo(viewType).Assembly.FullName;
    var typeString = string.Format(CultureInfo.InvariantCulture, $"{_viewModel}, {fullName}");
    DynamicViewModel = null;

    return Type.GetType(typeString);
}

然后,当我想要导航时,我会提前交出ViewModel。

代码语言:javascript
复制
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
    Bootstrapper.DynamicViewModel = typeof(EventsViewModel);
    _regionManager.RequestNavigate(RegionNames.ContentRegionName, typeof(Events).ToString());
}

有点棘手,但它似乎没有任何例外地工作。

如果有一个更干净的方法,我总是很乐意在这里。:)

EN

回答 1

Stack Overflow用户

发布于 2016-07-24 00:49:22

以下是获取视图(视图优先)的视图模型的一些技术。

构造函数后面的视图代码中的视图发现

代码语言:javascript
复制
public EventsView(EventsViewModel view_model)
{
    InitializeComponent();
    DataContext = view_model;
}

在构造函数后面的代码中显式更新视图模型

代码语言:javascript
复制
public EventsView()
{
    InitializeComponent();
    DataContext = new EventsViewModel();
}

视图的XAML中的View model locator

代码语言:javascript
复制
<UserControl x:Class="EventsModule.Views.EventsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <TextBlock Text="{Binding EventName}"></TextBlock>
    </Grid>
</UserControl>

只要您使用下面的任何一种技术向区域管理器注册视图,上面的任何一种都可以工作。然后像你在你的问题中所做的那样导航。

代码语言:javascript
复制
RegionManager.RegisterViewWithRegion(RegionNames.ContentRegionName, typeof(EventsView));
UnityContainer.RegisterType(typeof(object), typeof(EventsView), typeof(EventsView).FullName);
UnityContainer.RegisterTypeForNavigation<EventsView>(typeof(EventsView).FullName);

第一个将激活区域中的视图,通常出现在模块Initialize方法中。最后两个是为了注册一个视图,以便以后导航。最后一个需要Prism.Unity名称空间。

我不相信一个视图可以有多个视图模型,因为视图对象上只有一个DataContext属性。您可能必须扩展一个视图模型以包含所需的所有内容。可能会有人来证明我在这件事上错了。我见过视图模型与多个视图共享的情况,但从未见过具有多个视图模型的视图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38542284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档