gpt4 book ai didi

wpf - 使用 MVVM 显示新窗口并获取更新数据

转载 作者:行者123 更新时间:2023-12-03 10:12:56 25 4
gpt4 key购买 nike

我正在开发一个 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 时关闭。属性设置。这就是为什么 DialogWindowDialogViewModelBase 的属性class - 当子类化对话框 ViewModel想要关闭对话窗口,它只是设置结果:

protected void CloseDialogWithResult(bool dialogWindowResult)
{
// Setting this property automatically closes the dialog window:
this.DialogWindow.DialogResult = dialogWindowResult;
}

对话 View 的主机窗口
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...
}
}

PS:我真的应该写一篇关于这个的博客条目——当我这样做时,我会在这里发布链接,因为博客条目可能会有更完整的代码示例。

关于wpf - 使用 MVVM 显示新窗口并获取更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14826765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com