2016-11-15 4 views
0

У меня вопрос о связи VM.Доступ к MainViewModel с другой модели просмотра

Вот мой код в приложении C#/WPF. На моем MainWindow.xam у меня есть кнопка. При нажатии этой кнопки Мне нужно получить доступ и изменить коллекцию ProductList из другой ViewModel. Как мне это достичь?

public List<ProductInfo> ProductList { get; private set; } 

private MainWindow m_mvWindow = null; 

public MainWindowViewModel(MainWindow window) 
{ 
    this.m_mvWindow = window; 
} 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new MainWindowViewModel(this); 
    } 
} 

Благодарности.

+0

Вы используете MVVM-каркас? Я использую MVVM Light, и для такой проблемы я бы использовал класс Messenger (реализация шаблона посредника). «Другая» VM подписалась на сообщение, и MainViewModel (в команде, управляющей щелчком кнопки), отправит сообщение. – Misza

+0

Зачем вы хотите это сделать? Если у вашей кнопки «MainWindow» есть кнопка, эта кнопка должна вызывать «ICommand» из вашего «MainWindowViewModel», и это позволит изменить данные, возможно, через службу. Если данные также отображаются в другом представлении, то это представление и «MainWindow» должны получать свои данные из общего источника, и этот источник должен уведомлять об обновлениях. _Вы действительно не нужно передавать модели или команды просмотра в другую модель или команды вида, они есть для view._ – Haukinger

ответ

2

Простейшим решением было бы разоблачить вашу другую виртуальную машину как свойство MainWindowViewModel, передать дочерней виртуальной машине ссылку на коллекцию ProductList и иметь ICommand на дочерней VM, которая привязана к кнопке в вашем XAML и которая обрабатывает изменения коллекции.

Что-то вроде этого:

Главная VM

public class MainViewModel 
{ 
    <!-- Your stuff -> 
    public ChildViewModel ChildViewModel 
    { 
     if(_childViewModel == null) 
     { 
     _childViewModel = new ChildViewModel(ProductList) 
     } 
     return _childViewModel;   
    } 
} 

Ребенок В.М.

public class ChildViewModel 
{ 
    private List<ProductInfo> _products; 

    public DelegateCommand ClearCollection {get; set;} 

    public ChildViewModel(List<ProductInfo> products) 
    { 
     _products = products; 
     ClearCollection = new DelegateCommand(OnClearCollection); 
    } 

    private void OnClearCollection() 
    { 
     _products.Clear(); 
    } 
} 

И в XAML ...

<Button Command={Binding ChildViewModel.ClearCommand} Content="..." /> 
0

Вы можете использовать любой из них способов:

  1. Создайте событие в другой модели представления и обработайте его в модели основного вида. Это было бы предпочтительным способом, поскольку он не позволяет связать вашу дочернюю виртуальную машину с главной виртуальной машиной, что плохо проектируется.
  2. Передача коллекции дочерней виртуальной машинке в конструкторе. Старайтесь не пропускать полную основную виртуальную машину, чтобы избежать соединения.
Смежные вопросы