2016-01-24 53 views
0

我被要求在WPF中開發一個包含地圖控件(OnlineMapControl)的對話窗口。地圖控件&關聯的業務邏輯位於後面的代碼中。我將我的控件構建爲一個窗口,並且編寫了一個簡單的視圖模型。使用MVVM模式控制後面的代碼?

觸發對話框的父視圖來自視圖模型中的按鈕命令。我知道最好我們應該使用IDialogService或同等然而學長建議我去與.showdialog()在視圖模型方法的命令一拉:

Public ShowChildDialogCommandAction() 
{ 
    DialogViewModel dialogViewModel = NewDialogViewModel(); 
    DialogView dialogview = new DialogView(dialogViewModel); 

    dialogView.ShowDialog(); 
} 

這工作得很好,緊耦合一邊。當我嘗試訪問基於地圖控件背後的子視圖代碼的屬性時出現問題。 dialogViewModel實例對OnlineMapControl一無所知,因此我發現自己試圖通過所有這些具有重複屬性名稱的類來追逐屬性值&在DialogView代碼中使用this.onlineMapControl.zoomLevel = this.dialogViewModel.zoomLevel等進入邏輯意大利麪等。這只是一個非常糟糕的代碼味道。你如何處理類似於此的設計,只能通過&後面的代碼訪問視圖中的複雜控件,使MVVM模式保持完好?

+0

如果沒有任何顯示問題出在哪裏的代碼,就很難評論。這聽起來像是你的地圖控件應該暴露像ZoomLevel之類的東西的各種依賴屬性,然後你只要將它們綁定到你的'DialogView'中的'DialogViewModel'。 –

+0

mvvm!=沒有隱藏代碼。 UI邏輯應該放在你的UI中。 – Will

回答

0

如果你正在做正確的MVVM那麼你的視圖模型應該是視圖的DataContext的:

DialogViewModel dialogViewModel = NewDialogViewModel(); 
DialogView dialogview = new DialogView{DataContext = dialogViewModel}; 

從上DialogView XAML這一點應該使用數據綁定,不應該有任何代碼隱藏本身,因此在它和DialogViewModel之間複製任何數據都成爲一個爭議點。

順便說一句,服務並不是實現對話框的唯一方法,使用常規數據綁定實現起來非常容易,如我在an article I wrote last year中所示。

相關問題