【问题标题】:Multiple views binding to multiple ViewModels多个视图绑定到多个 ViewModel
【发布时间】:2014-02-25 11:16:31
【问题描述】:

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

tagVisualizerSearchViewTagVisualizer 类型的控制元素。所以多个SearchTagViews 被放在一个SearchView 中。这行得通。

问题是因为依赖注入 all SearchTagViews 使用相同 SearchTagViewModel:

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

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

【问题讨论】:

  • 你如何在项目中使用IoC?你在用UnityBootStrapper吗?如果您要求 UnityContainer 解决任何类型依赖关系,默认情况下它会返回新实例,除非您使用某些 ControlledLifetimeManager 对象注册。
  • 看来我的框架为 IoC 使用了“System.ComponentModel.Composition”

标签: c# wpf xaml mvvm pixelsense


【解决方案1】:

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

  1. 作为单个实例(返回类的相同实例 每次)
  2. 每次解析/注入时作为一个新实例

您需要弄清楚如何在您的 IoC 框架中执行 #2。

另一个以 MVVM 为中心的选项是在您的 UI 中声明一个 DataTemplate 并将 ViewModel 直接添加到 UI 并让 WPF 自动为其创建视图。

编辑:

看起来 WAF 正在将 MEF 用于 IoC。您需要提供 [Export] 属性并将其指定为非共享。

Here's how to set a PartCreationPolicy with MEF from a previous question

【讨论】:

    【解决方案2】:

    您可以为此目的使用视图模型定位器。查看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>
    

    【讨论】:

    • 听起来不错,但这不是我必须使用的 WAF 框架的解决方案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多