2011-01-24 45 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