【问题标题】:How can I include my custom user control with its custom view model into my xaml view?如何将我的自定义用户控件及其自定义视图模型包含到我的 xaml 视图中?
【发布时间】:2019-11-21 15:41:21
【问题描述】:

总的来说,我对 prism / xaml 有一个小问题。如果有人有线索,我很乐意知道。

我用 Prism 模块 (Prism 6.3.0) 制作了一个标准 Prism 应用程序。我有一个由以下代码组成的主视图:

<!-- 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 可用。当然,实现IMyUserControlViewModel 并且我想注入到视图中的MyUserControlViewModel 在服务中有依赖关系。我怎样才能把它连接起来?我尝试了很多事情都没有成功。我很清楚these advanced ways of wiring upthese basic ways of wiring up。我的猜测是这是不可能的,因为在 MainView.xaml 中,我们使用

prism:ViewModelLocator.AutoWireViewModel="True"

我看对了吗?如果没有,我的想法怎么可能实现?如here 所述,是否可以不更改ViewModelLocator 的配置?在我正在工作的项目中,出于一些模糊的原因,他们希望坚持使用自动视图模型布线。有没有办法覆盖模块初始化代码中的自动视图模型布线?我说的模块初始化代码是这样的

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>());
    }
}

【问题讨论】:

  • 你不能在 ?UserControl 上也使用prism:ViewModelLocator.AutoWireViewModel="True" 吗?然后 Prism 应该能够自动为您解析 DataContext,前提是您已向容器注册了接口。
  • 我不能,因为这不会遵循prism conventions,这是我们进行自动视图模型布线时所必需的。例如,我的视图模型不会与视图位于同一个程序集中。

标签: c# wpf xaml prism


【解决方案1】:

作为一般规则,如果可以,请先尝试查看模型,因为它使事情变得更容易和更清晰。

所以在你的情况下,而不是

<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>

使用 DataTemplateIMyUserControlViewModel 映射到 MyUserControl 并从您的视图模型中公开子视图模型的实例。这样,您可以使用专门为手头的用例量身定制的实例,而不必为了取悦ViewModelLocator 而跳过循环。

【讨论】:

  • 嗯,这很有趣。我记得在 prism 文档的某个地方看到过,我想我会尝试一下,然后忘记了。我会试一试,谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多