如何将我的自定义用户控件及其自定义视图模型包含到我的xaml视图中?

问题描述 投票:0回答:1

一般来说,我会对棱镜/ xml有一个小问题。如果有人有线索,我很乐意知道。

我用一个棱镜模块(Prism 6.3.0)组成了一个标准的棱镜应用程序。在那里,我有一个由以下代码组成的主视图:

<!-- MainView.xaml -->
<UserControl prism:ViewModelLocator.AutoWireViewModel="True"
             ...>
[...]
    <dxb:BarManager>
        [...]
            <local:MyUserControl/>
        [...]
    </dxb:BarManager>
</UserControl>

在这种情况下,您会注意到

<local:MyUserControl/>

该东西实现如下:

<!-- MyUserControl.xaml -->

<dxr:RibbonPageGroup x:Class="MyUserControl" ...>
    [...]

    <dxb:BarButtonItem Content="Import"
                       Command="{Binding ImportDataCommand}" />
    [...]
</dxr:RibbonPageGroup>

// MyUserControl.xaml.cs
public partial class MyUserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }
}

现在,想法是MyUserControl使用其自己的视图模型,因为它需要包含与该特定控件相关的特殊逻辑。所有这些逻辑都由接口IMyUserControlViewModel定义,我想将其插入MyUserControl并将其用作DataContext。当然,MyUserControlViewModel实现了IMyUserControlViewModel,我想将其注入视图中,但它具有服务依赖性。我该如何接线呢?我尝试了很多事情都没有成功。我对these advanced ways of wiring upthese basic ways of wiring up了如指掌。我的猜测是不可能的,因为在MainView.xaml中,我们使用

prism:ViewModelLocator.AutoWireViewModel="True"

我看到正确吗?如果没有,如何实现我的想法?如ViewModelLocator所述,是否可以不更改here的配置而做?在我正在从事的项目中,由于某些晦涩的原因,他们希望坚持使用自动视图模型接线。有没有办法在模块初始化代码中覆盖自动视图模型的连接?我正在谈论的模块初始化代码类似于

public class MyModule : IModule
{
    private readonly IUnityContainer _container;
    private readonly IRegionManager _regionManager;

    public MyModule (IUnityContainer container, IRegionManager regionManager)
    {
        _container = container;
        _regionManager = regionManager;
    }

    public void Initialize()
    {
        //_container.RegisterType<>();

       _regionManager.AddToRegion(RegionNames.MainRegion, ServiceLocator.Current.GetInstance<MainView>());
    }
}
c# wpf xaml prism
1个回答
0
投票

作为一般规则,如果可以的话,请先尝试查看模型,因为这样做会使事情变得更加容易和清楚。

所以就您而言,而不是

<UserControl prism:ViewModelLocator.AutoWireViewModel="True">
    <dxb:BarManager>
        <local:MyUserControl/>
    </dxb:BarManager>
</UserControl>

<UserControl prism:ViewModelLocator.AutoWireViewModel="True">
    <dxb:BarManager>
        <ContentControl Content={Binding SpecialViewModel}/>
    </dxb:BarManager>
</UserControl>

[DataTemplate会将IMyUserControlViewModel映射到MyUserControl,并从视图模型中公开子视图模型的实例。这样,您可以使用专门针对实例的专用实例,而不必为了满足ViewModelLocator而跳过循环。

© www.soinside.com 2019 - 2024. All rights reserved.