簡體   English   中英

WPF MVVM-VM中的顯示表單

[英]WPF MVVM - Display Form in VM

我是MVVM新手,如果我在邏輯上做錯了,請告訴我。

基本上frmEpisodeView.xaml應該是在此處設置的啟動窗口:

StartupUri="View/frmEpisodeView.xaml"

當此Windows加載時,我想檢查用戶是否已經使用了該應用程序,並且沒有可用的registry key

我已經從下面的代碼中為frmEpisodeView.xaml設置了datacontext ,如下所示

DataContext = new EpisodeViewModel();

在My EpisodeViewModel.cs ,執行檢查注冊表項的邏輯

public EpisodeViewModel() {

    if (Registry.GetValue("HKEY_CURRENT_USER", "URL", "") == null)
    {        
        //OPEN FORM HERE FRMLOGINVIEW.XAML
        ServerURL = Registry.GetValue("HKEY_CURRENT_USER", "URL", "").ToString();
    }
}

在邏輯上,如果注冊表項為空,則應該在用戶登錄的地方顯示一個表單,然后該表單會將條目保存在該頁面上。

如何使表格出現?

我認為最簡單的方法是編寫一個幫助程序類。 為此服務創建一個接口,然后實現ShowWindow(object DataContext)方法以顯示您喜歡的窗口並設置datacontext。

class WindowService:IWindowService
{
    public void showWindow<T>(object DataContext) where T: Window, new() 
    {
     ChildWindow window = new T();
     window.Datacontext = DataContext;
     window.Show();
    }
}

另一種非常優雅的方法是使用如下所示的Action( Source ):

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        DataContext = new MainViewModel(() => (new Window()).Show()); // would be actual window
    }
}

public class MainViewModel
{
    private Action popupAction;
    public MainViewModel(Action popupAction)
    {
        this.popupAction = popupAction;
    }

    public ICommand PopupCommand { get; set; }

    public void PopupCommandAction()
    {
        popupAction();
    }
}

public class SomeUnitTest
{
    public void TestVM()
    {
        var vm = new MainViewModel(() => { });
    }
}

因此,我將如何首先將其作為一個快速示例進行說明。

視圖模型

public class EpisodeViewModel
{
    private readonly IEpisodeModel episodeModel;

    private readonly IViewFinder viewFinder;

    public EpisodeViewModel(IEpisodeModel episodeModel, IViewFinder viewFnder)
    {
        this.episodeModel = episodeModel;
        this.viewFinder = viewFinder;
        CheckLoginPassed(this.episodeModel.LoginPassed);
    }

    private CheckLoginPassed(bool loginPassed)
    {
        if (!loginPassed)
        {
            this.viewFinder.LoadView<ILoginView>();
        }
    }
}

IView界面

public interface IView
{
    void Show();
}

模型介面

public interface IEpisodeModel
{
    bool LoginPassed
    {
        get;
    }
}

模型

public class EpisodeModel : IEpisodeModel
{
    private bool loginPassed;

    public EpisodeModel()
    {
        if (Registry.GetValue("HKEY_CURRENT_USER", "URL", "") == null)
        {
            loginPassed = false;
        }
    }

    public bool LoginPassed
    {
        get
        {
            return this.loginPassed;
        }
    }
}

IViewFinder界面

public interface IViewFinder
{
    void LoadView<T>();
}

取景器

public class ViewFinder : IViewFinder
{
    private readonly IEnumerable<IView> availableViews;

    public ViewFinder(IEnumerable<IView> availableViews)
    {
        this.availableViews = availableViews;
    }

    public void LoadView<T>()
    {
        var type = typeof(T);

        foreach (var view in this.availableViews)
        {
            if (view.GetType().IsAssignableFrom(type))
            {
                view.Show();
            }
        }
    }

我在編寫此代碼時就考慮到了IoC,如果您沒有IoC,我真的希望獲得一個IoC,因為它在解決依賴項時將提供巨大幫助。 這只是一個基本示例,我可能會有一個不同的對象,該對象僅用於檢查將結果提供給Model的注冊表,但這應該提供一個起點。

因此,在引用ILoginView這是一個僅繼承自IView的接口,它實際上並未提供任何詳細信息。 IView界面有點怪異,因為只要它們的視圖也繼承自“ Window”,它們就已經實現了Show方法,因此實際上您不必執行任何操作,這只是提供了一種更簡單的調用show的方法,而無需實際知道您正在調用的是一個Window

另一點是,盡管ViewFinder可以用於一個小型項目,但它在這里相對簡單。我可能會看一下MVVM Light之類的東西來管理我的MVVM處理,因為它附帶了View處理和一個簡單的Service Locator作為標准配置。

是的,這是執行MVVM時的典型問題。 這些問題中的許多問題可以概括為:如何在具體的用戶界面中執行此操作或該具體的“操作”,因為我應該100%地將其放入視圖模型中?

我強烈建議您在https://msdn.microsoft.com/zh-cn/library/gg406140.aspx(Microsoft Prism Library 5.0 for WPF開發人員指南)中找到此類問題以及許多其他相關問題。

我個人認為閱讀本書非常高興,而且作者顯然知道他們所表達的內容。

最好的祝福,

亨里克·達爾

您總是可以將此視圖代碼放入App.xaml.cs構造函數中:

public App()
{
    if (Registry.GetValue("HKEY_CURRENT_USER", "URL", "") == null)
    {        
        //OPEN FORM HERE FRMLOGINVIEW.XAML
        StartupUri = new Uri("View/frmLoginView.xaml", UriKind.Relative);

        ServerURL = Registry.GetValue("HKEY_CURRENT_USER", "URL", "").ToString();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM