2017-02-12 27 views
0

我不確定我是否以正確的方式思考這個問題。我有一個對象列表,我希望用戶能夠編輯和查看指定對象的屬性。我最初的想法很好,我會彈出一個包含文本框的對話框,讓用戶編輯他們心中的內容,直到他們按下「確定」或「取消」。使用Prism和UWP做對話的正確方法

我在UWP上,並使用棱鏡來滿足我所有的MVVM需求。我花了一段時間,但我理解創建視圖及其相關的ViewModels,命令等等。到目前爲止,我認爲我已經很好地保持了視圖邏輯和業務邏輯的分離。

我搜索了,但還沒有找到如何以遵循MVVM原則的方式顯示對話框。似乎最重要的兩件事情是使用交互請求(在UWP中不會使用Prism存在),並創建一個自定義內容對話框,並通過在父視圖關聯的方法中調用ShowAsync來顯示它ViewModel(這似乎與MVVM原則相反)。

那麼,我該如何顯示一個使用XAML定義的對話框,並且有一個關聯的ViewModel(最好,因爲它與我所熟悉的相似),或者我可以解決這個問題的另一種方式?

回答

0

使用MVVM,打開對話框的適當位置在ViewModel中。

通常我做這樣的事情在您的情況:

用於顯示對話框創建一個界面:

public interface IWindowService 
{ 
    void OpenViewModelInWindow(ViewModelBase vm, string title, bool resizeable = true); 
    void CloseViewModelInWindow(ViewModelBase vm); 
} 

在UI層實現此接口:

public class WindowService : IWindowService 
{ 
    private List<Window> _windows = new List<Window>(); 

    public void OpenViewModelInWindow(ViewModelBase vm, string title, bool resizeable = true) 
    { 
     var window = new Window 
     { 
      Title = title, 
      Content = vm, 
      Owner = Application.Current.MainWindow, 
      WindowStartupLocation = WindowStartupLocation.CenterOwner, 
      ShowInTaskbar = false, 
      SizeToContent = SizeToContent.WidthAndHeight, 
      ResizeMode = resizeable ? ResizeMode.CanResize : ResizeMode.NoResize 
     }; 
     _windows.Add(window); 
     window.ShowDialog(); 
    } 

    public void CloseViewModelInWindow(ViewModelBase vm) 
    { 
     _windows.Single(w => w.Content == vm).Close(); 
    } 
} 

在你的應用程序。 xaml您需要定義DataTemplates,以便在窗口的Content屬性中設置窗口中創建的相應View。

<DataTemplate DataType="{x:Type viewModel:AViewModel}"> 
    <views:AUserControl /> 
</DataTemplate> 

然後你可以從ViewModel中使用IWindowService,你應該通過構造函數注入來注入它。

這樣你不直接從ViewModel引用框架特定的類。 ViewModel僅對IWindowService有參考。當你想爲視圖模型編寫單元測試時,這也有好處。你可以模擬這個服務,這樣當單元測試運行時它不應該打開一個對話框。

+0

這個回答適用於WPF,而不是UWP。 –