多个视图绑定到多个ViewModel

时间:2014-02-25 11:16:32

标签: c# wpf xaml mvvm pixelsense

我想创建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);

tagVisualizerTagVisualizerSearchView类型的控件元素。因此,多个SearchTagViews被放置在一个SearchView中。这很有效。

问题是因为依赖注入所有 SearchTagViews 使用相同的 SearchTagViewModel

xmlns:vm="clr-namespace:Applications.ViewModels;assembly=Applications"

如何在MVVM之后为每个View 使用不同的ViewModel?

3 个答案:

答案 0 :(得分:1)

我见过的每个IoC框架都允许您以两种方式注册类型:

  1. 作为单个实例(返回类的相同实例 每一次)
  2. 每次解析/注入时都是一个新实例
  3. 您需要弄清楚如何在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)

艾伦关于非共享属性的提示很好,但我无法用它来解决我的问题。问题是MEF在我创建TagVisualizationDefinitions之前正在工作。

唯一的解决方案是在事件TagVisualization_Loaded的方法中设置父用户控件的代码隐藏中的绑定