2014-02-25 49 views
0

我想創建一個SearchTagView的多個實例,並將其綁定到它自己的SearchTagViewModel多個視圖綁定到多個ViewModels

我使用WPF的WAF框架,它遵循MVVM概念和依賴注入(IoC)。該應用程序是使用SurfaceSDK爲SUR40開發的。

這意味着視圖被實例是這樣的:

TagVisualizationDefinition tagDefinition = new TagVisualizationDefinition(); 
tagDefinition.Source = new Uri("Views/SearchTagView.xaml", UriKind.Relative); 
tagVisualizer.Definitions.Add(tagDefinition); 

tagVisualizerTagVisualizer類型的在SearchView的控制元件。所以多個SearchTagViews被放置在一個SearchView。這工作。

問題是因爲依賴注入的所有SearchTagViews使用相同的SearchTagViewModel

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

如何使用不同的視圖模型爲每個視圖繼MVVM?

+0

父用戶控件的代碼隱藏的約束力?你在使用'UnityBootStrapper'嗎?如果你要求'UnityContainer'解決任何類型依賴,默認情況下它會返回新的實例,除非你註冊一些'ControlledLifetimeManager'對象。 –

+0

看來我的框架爲IoC – 10ff

回答

0

艾倫的提示還是不錯的,但我不能用它來解決我的問題。問題是在我啓動我的TagVisualizationDefinitions之前,MEF正在工作。

唯一的解決辦法是設置在方法你是如何在項目中使用`IoC`事件TagVisualization_Loaded

0

您可以使用視圖模型定位器來實現此目的。檢出this

將視圖模型定位器配置爲每次返回視圖模型的新實例。

下面給出一個示例,使用mvvm light(即使您不需要使用mvvm light來使用視圖模型定位器)。

public class ViewModelLocator 
{ 
    public ViewModel1 VM1 
     { 
      get 
      { 
       return new ViewModel1(); 
      } 
     } 
} 

在App.xaml中,定義視圖模型locator.If您的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> 
+0

使用'System.ComponentModel.Composition'聽起來不錯,但這不是我必須使用的WAF框架的解決方案。 – 10ff

1

我見過的每個IoC框架允許您通過兩種方式註冊類型:

  1. 作爲單個實例(類的同一個實例返回每次 )每次
  2. 作爲一個新的實例是解決/注射

你需要弄清楚如何做# 2在您的IoC框架內。

另一個以MVVM爲中心的選項是在UI中聲明DataTemplate並將ViewModel直接添加到UI並讓WPF自動爲其創建Views。

編輯:

看起來WAF使用MEF的IoC的。您需要提供[導出]屬性並將其指定爲非共享。關於非共享屬性

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

相關問題