2016-09-01 191 views
0

我正在開發一個使用MVVM模式,C#和.NET Framework 4.6.1的WPF。從另一個ViewModel訪問ViewModel

我有一個包含UserControl(Control1)的窗口,並且UserControl包含另一個UserControl(Control2)。我選擇了這種方式來代替使用對話框窗口(Control2充當對話框窗口)。

兩個用戶控件都有一個Viewmodel(Control1VMControl2VM)。

我使用Control2作爲表單讓用戶輸入一些我需要的數據來啓動應用程序。

這是Control1的主窗口:

enter image description here

這是Control2超過Control1

enter image description here

我的問題是,我不知道如何隱藏Control2當我點擊確定或取消按鈕。

這是Control2的設置上Control1

<Grid x:Name="gridControl2" Margin="30" Grid.RowSpan="6" Grid.ColumnSpan="3" Visibility="{Binding GridControl2Visibility}"> 
    <local:Control2 x:Name="userControlControl2" /> 
</Grid> 

要顯示Control2Control1VM設置GridControl2VisibilityVisible

public Visibility GridControl2Visibility 
{ 
    get { return gridControl2Visibility; } 
    set 
    { 
     if (gridControl2Visibility != value) 
     { 
      gridControl2Visibility = value; 

      RaisePropertyChangedEvent("GridControl2Visibility"); 
     } 
    } 
} 

如何隱藏Control2當我點擊確定或取消按鈕在Control2?我的問題是GridControl2VisibilityControl1VM,我無法從Control2VM訪問該類。

+0

通常的做法是使用MVVM工具包的消息傳遞功能。 – Lennart

+0

也爲窗口創建一個虛擬機,並在其中保留虛擬機的實例。子VM將由其子VM實例組成。這樣,您就可以從Window VM控制整個代碼。 – ViVi

回答

1

使用兩種視圖模型都可以訪問的服務,並存儲信息Control2是否應該可見。理想情況下,該服務將與您的di-container一起註冊爲singleton,並注入到視圖模型中。

或者,您可以使用事件聚合器,它基本上也是單件服務,但是專注於分發事件而不是持有狀態。

+0

要做到這一點,我已經按照這篇文章:https://rachel53461.wordpress.com/2011/10/09/simplifying-prisms-eventaggregator/ – VansFannel

-1

您可以使用事件,您可以從Control2VM引發事件,並將它放在Control1VM中並將GridControl2Visibility設置爲false。

相關問題