0

MVVM模式對於MVVM Light更好,但有時我覺得我什麼都不懂。 我在SL 4中有一個業務應用程序,到目前爲止,我已經有18個虛擬機......而且還有更多的應用需要編寫!我正在應用Laurent Bugnion在MIX11會議中使用的模式(使用SimpleIoc類)。如何和在哪裏配置ViewModel?

viewmodel綁定到一個視圖(將其命名爲「A」),但同一視圖模型也綁定到另一個視圖(將其命名爲「B」)。在ViewModelLocator中以標準方式調用與視圖「A」綁定的Viewmodel。與視圖B綁定的視圖模型被調用一個不同的鍵,以確保它們是2個不同的接口。除了注入不同的DomainService,實體與視圖上的控件綁定也是不同的。

一些郵件的視圖模型的寄存器來跟蹤在它相互作用其他的ViewModels的變化,比方說一個選擇改變裝置,用戶想爲了以檢索對DB數據)來顯示其它的東西。

問題是如果我調用視圖A然後查看B我註冊了相同的消息2次所以我對數據庫有2個操作。

我認爲正確的是當我調用視圖B時(通常當我關閉視圖A時)將視圖模型綁定到視圖A。但我真的不知道該如何處置它,何時和如何!好吧..我可以想象何時以及如何......但在哪裏?

如果你覺得我很困惑,那你是對的!

回答

1

如果我正確理解你,你使用了兩個不同視圖的相同ViewModel。您一次只需要一個VM的副本。

在這種情況下,我可能會使用任何虛擬機的父和修改像在VM模式屬性。

<DataTemplate x:Key="ViewA" TargetType="{x:Type local:MyViewModel}"> 
    <TextBlock Text="I'm View A" /> 
</DataTemplate> 

<DataTemplate x:Key="ViewB" TargetType="{x:Type local:MyViewModel}"> 
    <TextBlock Text="I'm View B" /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:MyViewModel}"> 
    <ContentControl Content="{Binding }"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="ContentTemplate" Value="{StaticResource ViewA}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Mode}" Value="2"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ViewB}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 

然後切換視圖,我想簡單地設置ParentViewModel.CurrentViewModel.Mode = 2和查看簡單地被不改變視圖模型切換。

如果你想在同一視圖模型的兩個不同的副本,我還是會使用類似ParentViewModel.CurrentViewModel = ViewModelInstanceB處理在ParentViewModel開關,並有ViewModelInstanceB.Mode設置爲2

我寫的意見here之間切換一些例子如果你有興趣

+0

謝謝你的回答,瑞秋。問題略有不同。問題不在於獲取相同視圖模型的單個實例。問題是隻保留一個實例而不是兩個實例。如果在視圖模型的構造我有「Messenger.Default.Register (這一點,(X)=> DoSomething的());」,即視圖模型的兩個實例意味着DoSomething的()兩個不同的電話時,我送「Messenger.Default .Send(new SomeToken())「。我想處理綁定到視圖的viewmodel不活動。 – 2011-05-31 07:52:10

+0

@Angelo我仍然會在父ViewModel中做到這一點。第二臺虛擬機註冊後,處置第一臺虛擬機。 – Rachel 2011-05-31 12:14:56