2015-11-19 97 views
0

我使用經典的MVVM模式,將DataTemplats定義爲資源,然後將Content屬性綁定到視圖中的相應ViewModels。該的DataTemplates的定義,像這樣:查看不更新(更改ViewModel但不是ViewModel類型)

<Application.Resources> 
    <DataTemplate DataType="{x:Type vm:PersonViewModel}"> 
     <vw:PersonView/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:ProductViewModel}"> 
     <vw:ProductView/> 
    </DataTemplate> 
</Application.Resources> 

在視圖中的某個地方我用一個ContentPresenter和綁定的內容屬性

<Grid DataContext={Binding MainViewModel, Source={StaticResource Locator}}"}> 
    <ContentPresenter Content="{Binding DetailsViewModel}"></ContentPresenter> 
</Grid> 

在我的用戶界面我有項目列表的左側面板中,讓說人和產品。在右邊,我正在加載每個項目的詳細信息。只要我人之間切換

DetailsViewModel = new ProductViewModel(); 

:當我點擊我一個人會改變MainViewModel的DetailsViewModel屬性,像這樣:

DetailsViewModel = new PersonViewModel(); 

如果我點擊一個產品,我會那麼ofcourse做和左側面板中的產品將正確的視圖加載到ContentPresenter中。

但是,這是問題所在。如果我點擊相同類型的一個對象(即單擊人員A,然後單擊人員B),視圖將不會更新以反映ViewModel中的更改。請注意,此時我們創建一個PersonViewModel的新實例並將其分配給DetailsViewModel。設置DetailsViewModel將正確地引發事件,但PersonView的代碼隱藏文件中的InitializeComponent()永遠不會被調用。這裏發生了什麼,我能做些什麼來解決它?

+0

這是什麼意思,你點擊相同類型的對象?反映這種情況的更多代碼將非常感謝。 – Maximus

+0

我的意思是,當我點擊Person A時,我將設置DetailsViewModel = new PersonViewModel(「Person A」);當我點擊另一個人時,我將設置DetailsViewModel = new PersonViewModel(「Person B」);這是在單擊列表時調用的命令內完成的。 DetailsViewModel屬性使用新的視圖模型實例更新,但視圖模型的類型未更改。我希望我的新視圖模型能夠刷新或重新創建視圖,但這不會發生。它只會顯示Person A的數據。 – sunefred

回答

0

我已經使用過這個確切的模式,它已經工作。

兩件事情:

我假定你的財產DetailsViewModel在視圖模型是 養PropertyChanged事件

數據模板我的意見也有DataContext="{Binding}"定義。

<DataTemplate DataType="{x:Type vm:PersonViewModel}"> 
    <vw:PersonView DataContext="{Binding}"/> 
</DataTemplate> 
+0

只要100%確定,即使從PersonViewModel的一個實例切換到另一個PersonViewModel實例,這也適用於您? – sunefred

+0

我正在觀察完全相同的行爲。當ContentPresenter的內容更改爲具有相同類型的另一個實例時,則不會創建新的視圖實例。我仍在調查解決方法。 –

+0

是的,我已確認綁定到ContentPresenter.Content屬性的屬性正在引發屬性已更改的事件。 –