如何将我的自定义用户控件及其自定义视图模型包含到我的 xaml 视图中?
How can I include my custom user control with its custom view model into my xaml view?
一般来说,我对棱镜/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
可用。当然,MyUserControlViewModel
,它实现了IMyUserControlViewModel
,我想将其注入到视图中,它在服务中具有依赖性。我怎样才能把它连接起来?我尝试了很多事情都没有成功。我很清楚these advanced ways of wiring up and these 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>());
}
}
作为一般规则,如果可以的话,请先尝试查看模型,因为它会使事情变得更容易和更清晰。
所以在你的情况下,而不是
<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
.
而跳转循环
一般来说,我对棱镜/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
可用。当然,MyUserControlViewModel
,它实现了IMyUserControlViewModel
,我想将其注入到视图中,它在服务中具有依赖性。我怎样才能把它连接起来?我尝试了很多事情都没有成功。我很清楚these advanced ways of wiring up and these 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>());
}
}
作为一般规则,如果可以的话,请先尝试查看模型,因为它会使事情变得更容易和更清晰。
所以在你的情况下,而不是
<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
.