- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 WPF MVVM 应用程序。我在数据网格中显示一些数据。我有两个按钮来添加和编辑选定的记录。我在 ViewModel 中有数据,我必须显示另一个窗口( View )并确保 ViewModels 不应该有关于 View 的信息。
我应该在哪里创建它的 View 和 View 模型?
如何取回数据并更新数据网格?
如何在 MVVM 中实现这一点?
我们还没有决定使用任何框架,所以我必须创建自己的界面。
最佳答案
注意:这最终是一个很长的答案 - 如果有什么不清楚的地方请问我
对话窗口的实现在 MVVM 设计中是一个有争议的问题,不同的人使用不同的方法。
和你一样,我决定不使用任何框架并手动实现大多数东西。当谈到对话窗口时,我选择通过从 ViewModel 内部启动对话窗口来务实地实现 MVVM。此外,我允许每个 Dialog ViewModel 引用它所显示的 Window,因此它可以在适当的时候关闭它(详情如下)。这打破了一些严格的 MVVM “规则”,但它完成了工作。
这样做的主要缺点是,如果您正在测试通过对话框的内容,它可能会破坏单元测试。但是,您可以走很长一段路而不会遇到这个问题,而且它还没有困扰我。
我已经建立了一些可以轻松扩展的对话框 ViewModel 库。在这里发布的代码太多了,但我会向您展示重点。
对话框的基本 View 模型
我的每个对话窗口都有一个继承自 DialogViewModelBase
的 ViewModel。 ,这类似于我的常规 ViewModelBase
因为它支持INotifyPropertyChanged
等等。有趣的部分是这个公共(public)方法,我从任何地方调用它来启动对话框:
/// <summary>
/// Creates window instance for this dialog viewmodel and displays it, getting the dialog result.
/// </summary>
public void ShowDialogWindow()
{
// This is a property of the DialogViewModelBase class - thus, each DialogViewModel holds a reference to its own DialogWindow:
this.DialogWindow = new Dialogs.Views.DialogWindow();
// Tell the DialogWindow to display this ViewModel:
this.DialogWindow.DataContext = this;
// Launch the Window, using a method of the Window baseclass, that only returns when the window is closed:
this.DialogWindow.ShowDialog();
}
Window.DialogResult
时关闭。属性设置。这就是为什么
DialogWindow
是
DialogViewModelBase
的属性class - 当子类化对话框
ViewModel
想要关闭对话窗口,它只是设置结果:
protected void CloseDialogWithResult(bool dialogWindowResult)
{
// Setting this property automatically closes the dialog window:
this.DialogWindow.DialogResult = dialogWindowResult;
}
Dialogs.Views.DialogWindow
ShowDialogWindow
的类方法实例化在 XAML 中定义,是
Window
的子类.它有两个重要的特点。第一个是它的主要内容元素只是一个
ContentControl
绑定(bind)到当前上下文。这允许我定义不同的
Views
对于
DialogViewModelBase
的不同子类,以及
DialogWindow
将托管相应的
View
基于上下文的类型:
<ContentControl Content="{Binding}" /> <!-- In reality this is inside a border etc but its simplified here for demonstration -->
DialogWindow
的第二个重要特征XAML 是它定义了哪个对话框
Views
使用哪个对话框
ViewModels
.这是一个示例:
<Window.Resources>
<!-- DEFAULT ViewModel-View TEMPLATES -->
<DataTemplate DataType="{x:Type dialogs:YesNoMessageBoxDialogViewModel}">
<views:MessageBoxView />
</DataTemplate>
<DataTemplate DataType="{x:Type dialogs:ErrorDialogViewModel}">
<views:ErrorDialogView/>
</DataTemplate>
</Window.Resources>
DialogViewModelBase
的子类。并实现
View
对于每个,然后告诉
DialogWindow
其中
View
它的
ContentControl
必须显示哪个对话框
ViewModel
.
ViewModels
,我在其中启动了一个对话框窗口,允许用户选择要创建的 Assets 类型:
public void CreateNewAsset()
{
// Instantiate desired Dialog ViewModel:
Dialogs.NewAssetTypeSelectionDialogViewModel dialog = new Dialogs.NewAssetTypeSelectionDialogViewModel();
// Launch Dialog by calling method on Dialog base class:
dialog.ShowDialogWindow();
// Execution will halt here until the Dialog window closes...
// The user's selection is stored in a property on the dialog ViewModel, and can now be retrieved:
CalculatorBase.AssetTypeEnum newAssetType = dialog.AssetType;
switch (newAssetType)
{
// Do stuff based on user's selection...
}
}
关于wpf - 使用 MVVM 显示新窗口并获取更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14826765/
我正在尝试使用特定路线打开一个新窗口,但似乎路线页面未正确加载。将从FrmApprovalMain.js打开新的 Electron 窗口,并应使用FrmPOdet.js打开新窗口。但是,当它打开时,会
我对 Tkinter 比较陌生,我需要帮助。 当从父窗口单击按钮时,我创建了一个新窗口。新窗口是 def new_Window。但我似乎无法获取窗口中的信息,如下编码: from tkinter im
我正在尝试使用 Javascript 从空白 iframe 中创建一个重定向,该 iframe 将定向到新窗口或选项卡中的 URL。 更具体地说,我试图让一个 Facebook 标签指向我公司的网页,
在问这个问题之前,我确实搜索了很多。抱歉,如果这是一个简单的问题。 在我的 wxWidgets 应用程序中,我想从菜单选项中新建一个 wxHtmlWindow。 (我已经正确显示了我的主应用程序窗口)
我认为我不是很了解这个,因为我对 jquery 还很陌生。我有一个隐藏了 3 个食谱的页面。单击食谱 A 的链接时,它会以模式打开。我希望能够只打印食谱的内容。所以我打开一个新窗口(非模态)并尝试将食
我想在带有可滚动文本框的现有主 Windwoe 旁边创建一个新窗口。 我在主窗口中按下“打开新窗口”按钮,然后它应该会打开一个带有可滚动文本框的新窗口。 在 form2 中 在 WPF 中,您可以在主
我正在使用 Simple Icons 制作自定义 Pinterest Pin It 按钮,我正在使用 Pinterest Widget Builder 给我的链接。在默认的 Pin It 按钮上,它会
我的表单上出现一个确认对话框,单击“确定”后会将用户重定向到另一个页面。 但是,是否可以在新窗口中打开该页面(例如 target="_blank") 我正在使用的代码是: var answer=con
相关但处于休眠状态:Javascript to open URL within a new Tab和其他一些...... 我有一个客户坚持认为特定链接需要在新选项卡中打开,而不是在窗口中打开。它由表单
我遇到了 Android 问题 WebView , 我想用 target='_blank' 打开一个 URL在同一WebView ,就像所有其他的一样URLs正在开放。 另请注意,我重写了 WebVi
可以从 Controller 重定向到某个 url 并同时在新窗口中打开该 url 吗? 最佳答案 不是真的来自 Controller Action 。 重定向是带有 301/302 状态代码和 Ra
在 Electron vue 中,我想为每个新窗口创建新的 vue 实例。这工作正常,直到我想将路由器子组件加载到新窗口。例如我有条目 add: path.join(__dirname, '../sr
案例1: var printWindow = window.open("", "print_window"); if(printWindow) { printWindow.addEventLi
我需要使用 Javascript Window.Open 函数打开一个新的 (_blank) 窗口。 URL 编码的回车符/换行符 (%0A) 似乎不起作用。有谁知道解决这个问题?例如,我有以下 UR
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Imp
当 flash 有键盘焦点时,CTRL+T(新标签)和 CTRL+N(新标签)窗口)被闪光拦截。 有没有办法将这些事件传递给浏览器以便它们工作(打开新选项卡,打开新浏览器)或者是否有用于这些操作的 j
我有一个 ASP.Net MVC 页面,上面有一个非常简单的表单:一个文本框和一个提交按钮。该表单使用标准的 mvc BeginForm() 语法: 当直接打开页面时,一切正常。 但是,我们有另一个
如果您对此问题感兴趣,请阅读下面的更新 #2 ;) 假设我将此代码放入我的扩展程序的 JS 中。 var reader = { onInputStreamReady : function(in
我是一名优秀的程序员,十分优秀!