2016-11-15 52 views
0

我有一個關於虛擬機通信的問題。從另一個視圖模型訪問MainViewModel

這是我在C#/ WPF應用程序中的代碼。在我的MainWindow.xam中,我有一個按鈕。 點擊這個按鈕, 我需要從另一個ViewModel中訪問和修改ProductList集合。 我該如何做到這一點?

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有一個按鈕,該按鈕應該從你的MainWindowViewModel觸發一個'ICommand',並且可以通過服務修改數據。如果數據在另一個視圖中顯示,那麼該視圖和「MainWindow」應該從一個公共源獲取它們的數據,並且該源應該通知它們更新。 _你確實不需要將視圖模型或命令傳遞給其他視圖模型或命令,它們就是爲了視圖._ – Haukinger

回答

2

最簡單的解決方案是將您的其他虛擬機作爲MainWindowViewModel的屬性公開,將子VM傳遞給ProductList集合,並在子虛擬機上綁定到XAML中的按鈕並具有ICommand,收集修改。

事情是這樣的:

主要VM

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

兒童VM

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. 將集合傳遞給構造函數中的子虛擬機。儘量避免傳遞完整的主VM,以避免耦合。
相關問題