我想创建SearchTagView
的多个实例,并将每个实例绑定到自己的SearchTagViewModel
。
我正在使用WPF的WAF框架,该框架遵循MVVM概念以及依赖注入(IoC)。该应用程序是使用SurfaceSDK为SUR40开发的。
这意味着视图实例化如下:
TagVisualizationDefinition tagDefinition = new TagVisualizationDefinition();
tagDefinition.Source = new Uri("Views/SearchTagView.xaml", UriKind.Relative);
tagVisualizer.Definitions.Add(tagDefinition);
tagVisualizer
是TagVisualizer
中SearchView
类型的控件元素。因此,多个SearchTagViews
被放置在一个SearchView
中。这很有效。
问题是因为依赖注入所有 SearchTagViews
使用相同的 SearchTagViewModel
:
xmlns:vm="clr-namespace:Applications.ViewModels;assembly=Applications"
如何在MVVM之后为每个View 使用不同的ViewModel?
答案 0 :(得分:1)
我见过的每个IoC框架都允许您以两种方式注册类型:
您需要弄清楚如何在IoC框架内执行#2。
另一个以MVVM为中心的选项是在UI中声明一个DataTemplate,并将ViewModel直接添加到UI中,让WPF自动为它创建视图。
编辑:
看起来WAF正在将IF用于IoC。您需要提供[Export]属性并将其指定为非共享。
Here's how to set a PartCreationPolicy with MEF from a previous question
答案 1 :(得分:0)
您可以使用视图模型定位器来实现此目的。查看this。
配置视图模型定位器以每次返回视图模型的新实例。
下面给出了一个示例,使用mvvm light(即使您不需要使用mvvm light来使用视图模型定位器)。
public class ViewModelLocator
{
public ViewModel1 VM1
{
get
{
return new ViewModel1();
}
}
}
在app.xaml中,为视图模型定位器定义一个键。如果你nuget mvvmlight,这将自动发生
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:WpfApplicationmvvmlight.ViewModel" />
</Application.Resources>
在视图中,使用定位器
<UserControl x:Class="WpfApplicationmvvmlight.View2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding Source={StaticResource Locator}, Path=VM1}">
</UserControl>
答案 2 :(得分:0)
TagVisualizationDefinitions
之前正在工作。
唯一的解决方案是在事件TagVisualization_Loaded
的方法中设置父用户控件的代码隐藏中的绑定