使用MEF和MVVM在View和ViewModels中实现接口

时间:2017-01-24 06:37:43

标签: c# wpf mvvm mef

后台:我有一个带有标签控件的窗口,每个标签都有一个单独的UserControl。我已经跟踪MVVM用于每个用户控件和MEF以获取要在运行时在选项卡中显示的控件。这是我的实现

interface ITabControl
{
} 

[Export(typeof(UserControl1ViewModel))]
class UserControl1ViewModel
{

}

class UserControl1: ITabControl
{
   [Import(typeof(UserControl1ViewModel))]
   public UserControl1ViewModel ViewModel
   {
        get { return this.DataContext as UserControl1ViewModel; }
        set { this.DataContext = value; }
   }
}

//Other user controls have similar implementation

public class WindowViewModel
{
    //Import all type of ITabControl and set the TabCollection(bound to ItemSource property of tab control)
}

问题:现在我根据主窗口中的用户操作在一组特定选项卡上进行了一些验证。所以我使用了另一个名为IConfiguration的接口,它由一些用户控件 ViewModels 实现。

interface IConfiguration
{
   public void Action1();
   public void Action2();
   ------------------- (many more)
} 

public class Window
{
   //Import all type of IConfiguration and call Action1/Action2 for all these types based on user actions. 
}

现在,如果在上述任何选项卡中验证过程中遇到错误(在不同的ViewModel中发生IConfigure操作),我需要将选项卡控件的SelectedTabItem属性设置为该特定选项卡。由于这些操作是在ViewModel中实现的,因此我无法获取UserControl来设置SelectedTabItem属性。我该如何实现这一目标?

PS:我知道我可以通过在UserControl视图中实现IConfiguration而不是ViewModel来实现这一目标

public class UserControl1 : IConfiguration
{ 
  public void Action1
  {
    this.ViewModel.Action1();
  }
  public void Action2
  {
    this.ViewModel.Action2();
  }
 //--------
} 

我想知道是否有更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

使用包含ViewModel集合(每个标签一个)的总体视图模型和表示活动标签的属性。

当您需要交换活动选项卡时,只需更新代表活动选项卡的属性,即可在viewmodel中执行此操作。此答案here向您展示如何绑定TabControl中的活动选项卡。