2017-01-24 10 views
0

Фон: У меня есть окно с элементом управления вкладкой с каждой вкладкой, имеющей отдельный UserControl. Я следил за MVVM для каждого пользовательского элемента управления и MEF для получения элементов управления, которые будут отображаться на вкладке во время выполнения. Это моя реализацияВнедрение интерфейсов в View и ViewModels с использованием MEF и MVVM

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. 
} 

Теперь, если возникает ошибка во время проверки (IConfigure действия impelemented в различных ViewModels) в любом из перечисленных выше вкладок, мне нужно, чтобы установить SelectedTabItem свойство элемента управления вкладки для этой конкретной вкладки. Поскольку эти действия реализованы в ViewModel, я не могу получить UserControl для установки свойства SelectedTabItem. Как мне это достичь?

PS: Я знаю, что могу достичь этого путем внедрения IConfiguration ввиду UserControl вместо ViewModel таким образом

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

Интересно, если есть лучший способ для достижения этой цели.

ответ

0

Используйте общую обзорную модель, содержащую коллекцию ViewModels (по одной на каждую вкладку) и свойство, которое представляет собой активную вкладку.

Когда вам нужно поменять активную вкладку, вы можете сделать это в режиме просмотра, просто обновив свойство, представляющее активную вкладку. В этом ответе here показано, как связать активную вкладку TabControl.