【问题标题】:WPF - Using behaviors for instantiating view model and servicesWPF - 使用行为来实例化视图模型和服务
【发布时间】:2015-11-06 13:43:14
【问题描述】:

我正在尝试找到创建视图模型和服务的最佳实践(服务只是与服务器对话并将数据返回给视图模型)。我见过两种不同的方法。

  1. 使用视图模型定位器
  2. 使用行为(我不确定这是否是好方法)

对于第二种方法,您在 UserControl 上定义一个行为,并在附加事件上创建一个视图模型实例和一个服务实例并将它们放在一起。

protected override void OnAttached()
    {
        var service = Activator.CreateInstance(ServiceType)
        var viewModel = Activator.CreateInstance(ModelType);
        base.AssociatedObject.DataContext = viewModel;
        base.OnAttached();
    }

在您的用户控件 xaml 中

<i:Interaction.Behaviors>
    <be:ViewModelBehavior ViewModelType="{x:Type vm:ViewModel1}"  ServiceType="{x:Type serv:Service1}"/>
</i:Interaction.Behaviors>

这是对行为的良好使用,还是我应该只使用视图模型定位器模式。

【问题讨论】:

  • 您的行为只不过是 ViewModelLocator 实现为行为。此外,还不清楚您对 ViewModelLocator 的理解是什么。一般来说,它是任何组件,允许您访问视图模型实例并且具有多种风格。
  • 我正在查看视图模型定位器的 MVVM 灯光实现,您是否建议第一种方法更好?

标签: wpf xaml mvvm behavior viewmodellocator


【解决方案1】:

您的行为有一个明显的缺点 - 在每个用户控件中,您必须指定行为、ViewModelType(以及 ServiceType)。

您可以执行以下操作:

<UserControl x:Class="MyApp.HomePage" ....
             local:ViewModelLocator.AutoWireViewModel="True">
   ...
</UserControl>

当您将附加属性设置为 true 时,ViewModelLocator 将创建视图模型实例并将其分配给用户控件的数据上下文。 ViewModelLocatator 使用命名约定来确定视图模型的类型。在这种情况下,它可能是HomePageViewModel,因为视图类型是HomePage

此方法由 Prism.Mvvm 库中的 PRISM ViewModelLocator 使用,但我建议您自己编写,因为它非常简单。

和你的ViewModelBehavior基本差不多,但有两点不同:

  1. 行为作为附加属性实现。它允许您在 Style 中指定行为,因此它将应用于使用此样式的任何用户控件。您不能在样式中指定 Interaction.Behaviors。

  2. 它使用命名约定而不是显式设置 ViewModelType


关于服务,应该作为参数传递给 viewmodel:您可以使用 IoC 模式。这是描述模式的伪代码:
public class MyViewModel(IMyService service) {...}

//at application startup you setup the IoC container:
IoC.Setup<IMyService>(new MyService());

//later
var viewModel = IoC.GetInstance<MyViewModel>(); //MyService will be passed as to ctor

【讨论】:

  • 感谢所有回答
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多