[英]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.