2011-01-24 49 views
0

我正在嘗試使用MVVM模式,具體來說,我正在試圖確定如何使用包含視圖(和視圖模型)的單獨類庫進行工作。在網絡上看起來,這與棱鏡和MEF都以不同的方式完成,而這可能就是我最終要做的。但最初,我正在使用ServiceLocator示例John Papa createdSilverlight類庫中的MVVM定位器類

在該樣本中,ViewModelLocator的位置在App.xaml中被定義爲靜態資源:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:MVVMLib="clr-namespace:MVVMLib;assembly=MVVMLib" 
    x:Class="VMLocatorDemo.App"> 
    <Application.Resources> 
     <MVVMLib:ViewModelLocator x:Key="VMLocator"/> 
     <MVVMLib:IndexerConverter x:Key="VMIndexerConverter" /> 
    </Application.Resources> 
</Application> 

因爲view.xaml是在同一個項目,它可以指定位器和一切是罰款:

<Grid x:Name="LayoutRoot" Background="White" 
     DataContext="{Binding Source={StaticResource VMLocator}, Converter={StaticResource VMIndexerConverter}, ConverterParameter=MainPageViewModel}">   
    <TextBlock Text="{Binding Path=CompanyName}"/> 
</Grid> 

然而,有獨立的類庫,我不能這樣做,因爲view.xaml不知道是哪裏的定位是,嗯,位於。我需要將定義保留在xaml中,以便我可以繼續使用不同的運行時/設計時視圖模型。

我想我的問題是,我如何在類庫中定義Locator類,或者,這正是爲什麼其他工具如MEF和/或棱鏡是必需的?

非常感謝

傑森

回答

0

下面是一個使用行爲,並使用常規默認情況下取景。我們的服務定位,但我想它可以改善不具有依賴於這個靜態類

public class ViewModelLocatingBehavior : Behavior<FrameworkElement> 
    { 
     #region Overrides 

     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      var viewType = AssociatedObject.GetType(); 

      var viewName = viewType.Name; 
      var viewModelName = viewName.EndsWith("View") 
            ? viewName + "Model" 
            : viewName + "ViewModel"; 

     AssociatedObject.DataContext = ServiceLocator.Current.GetInstance<object>(viewModelName); 
     } 

     protected override void OnDetaching() 
     { 
      base.OnDetaching(); 
     } 

     #endregion 

    } 

在XAML

<i:Interaction.Behaviors> 
    <u:ViewModelLocatingBehavior/> 
</i:Interaction.Behaviors> 
+0

感謝您的答覆。我並不太熟悉行爲(Silverlight新手),但我已經快速瀏覽過,並且可以看到它的工作原理。這是典型的行爲可能如何使用,或者這只是一個創意的方式,你想出解決類似的問題?這樣做有什麼限制或問題需要我注意? – Jason 2011-01-24 15:06:52