2011-07-12 34 views
1

我有一個主視圖,你有一個對象,你可以改變該對象的屬性。但是,當你點擊一個按鈕時,我有一個彈出窗口:高級屬性。但是,您在彈出窗口中所做的這些更改也必須在主視圖的對象中完成。如何通過兩個viewmodels傳遞對象? Wpf MVVM

所以我實現了一個viewmodel以及彈出窗口。我可以在這裏放一些代碼,但這是無用的,因爲我沒有任何東西,只有2個視圖模型綁定了一些文本框來改變對象的屬性。所以2個viewmodel不能在同一個對象上一起工作(這是我應該這樣做的)。

彈出窗口很難找到您在mainview中工作的對象。在某種程度上,我應該能夠將您在彈出窗口中所做的更改傳遞給主視圖(對同一對象)。有人知道如何做到這一點?我正在尋找這個很長一段時間,但我真的不知道修復或解決我的問題:(..

回答

0

根據您的架構,有多種方法可以實現此目的。例如,如果您使用的是豐富的域模型,則可能會直接綁定到視圖模型中公開的Model屬性。在這種情況下,當您調用高級屬性窗口時,可以將現有模型的實例傳遞給該視圖模型。高級屬性窗口中的更改將綁定到在原始窗口中打開的業務對象的相同實例。另外,如果您使用的是貧血域模型,而您並未將模型直接暴露給視圖,則仍然可以將模型的同一實例傳遞到新窗口,但使用中介模式(或任何其他模式其他標準視圖間模型通信技術)在高級窗口關閉時通知原始窗口。在這種情況下,高級窗口將是發佈者,而原始窗口是訂閱者。

通知後,原始窗口可以使其所有視圖模型綁定失效,以便根據需要更新UI。

+0

我使用第一個我認爲,但是我可以給這個高級窗口的視圖。但是現在我的問題是,當我關閉這個彈出窗口並返回到主屏幕時,我必須做什麼?然後,我必須將新更改的對象返回給主視圖模型?還是我現在錯了? – Ruben

+0

如上所述,您的第二個視圖模型將更新模型的相同實例,因此您不需要在原始視圖中更新原始副本。如果您只需在高級窗口關閉時收到通知,那麼正如我所說的那樣,您可以使用標準.NET事件來通知(在原始窗口中訂閱,在高級窗口中發佈)或事件聚合器,具體取決於你正在使用什麼MVVM框架。 – devdigital

+0

非常感謝!我終於明白了,它工作正常。 – Ruben

0

你可以有一個ViewModel,包括所有必要的屬性(基本屬性+的在詳細視圖中進行編輯)然後,您可以將相同的ViewModel傳遞給彈出視圖=>因此ViewModel對象實例是相同的,但兩個視圖只是有點不同,並允許編輯不同的屬性。

+0

我想我得到了,所以我只是做一個額外的viewmodel?然後我通過這個在這個視圖的構造函數中彈出?但是當我關閉這個彈出窗口時,我必須再次編輯基本屬性。那麼我該怎麼做呢?要將視圖模型再次傳遞給第一個視圖模型? – Ruben

0

您的視圖模型運行的這個「域」或「業務」對象來自哪裏?找到一種方法在視圖模型之間共享這個「源」

例如,如果您使用的是某種ORM你co uld實現一個(靜態)域服務,你的視圖模型要求這個對象。

示例:您的DomainService可能會公開一個方法「GetPersonById(int id)」,它會將同一對象返回給兩個ViewModels。

+0

不,我正在實現一些東西來填充對象中的屬性,然後應用程序將此對象寫入XML文件中。 – Ruben

0

或者你可以有一個BusinessObject傳遞給兩個ViewModels,每個將公開該視圖所需的東西。通過這種方式,您可以在兩臺虛擬機之間共享一個業務對象

相關問題