如何在 WPF 中使用 MVVM 从另一个视图打开一个视图

2024-04-19

我是 MVVM 新手。很长一段时间以来我都无法得到这个问题的答案。不知道是问题太难还是我没有解释清楚。我有 MainWindow.Xaml,其中包含一个文本块和一个用于从文本块接收数据的按钮,现在当我按下按钮时,它应该打开第二个名为 tableView.xaml 的视图(我已经为其创建了用户控件/Xaml)。

我现在有两个问题(请注意,我在回答时遵循 MVVM)?

(1) 如何通过关闭当前打开的 MainWindow.xaml 表单来从按钮单击打开此视图“tableView.xaml”(此按钮单击使用 MVVM 绑定)?

我的按钮单击代码必须打开此新表单(通过关闭当前的 MainWindow.xaml)位于此处(所以我猜打开 tableView.xaml 的代码必须仅位于此处):

 public void SaveExecuted() //some where here i have to open "tableView.Xaml"
 {
   System.Windows.MessageBox.Show(string.Format("Saved: {0} {1} ", DB_Col.DbName, DB_Col.NumTables));
 }
 public ICommand SavePersonCommand
        {
            get
            {
                if (savePersonCommand == null)
                    savePersonCommand = new DelegateCommand(new Action(SaveExecuted), new Func<bool>(SaveCanExecute));
                return savePersonCommand;
            }
        }

但该怎么做呢?

(2) “tableView.Xaml”必须包含 GUI,该 GUI 将根据我在单击“保存按钮”时在前面的 MainWindow.xaml 中收到的输入动态地用 C# 编写,并且必须将它们添加到 tableView.Xaml。那么如何以及在哪里编写该 C# 代码,以便由该 C# 代码生成的 GUI 将呈现在 tableView.Xaml 上?

Summary:有人可以让我知道如何通过单击按钮打开 tableView.Xaml 以及如何在 tableView.Xaml 上附加/渲染 GUI(我知道如何编写 C# 代码来生成 GUI,但在哪里编写该代码,以便它将在 tableView.Xaml 中呈现 GUI,尊重 MVVM 规则)。

EDIT:我觉得亲爱的帮助者仍然无法理解我想要做什么,所以请查看更多详细信息:

我要做的是:我有 MainWindow.xaml,其中包含文本框“输入表数”,该文本框正在接收用户的输入(作为他想要创建的表数)。用户输入此输入后,将单击“保存”按钮。现在保存按钮必须关闭 MainWindow.xaml 并将启动新的用户控件,即“tableView.xaml”。假设他输入 4 并保存。现在在新启动的 tableView.xaml 中,我必须显示将接收“表名称”、“列数”的文本框,如果他输入 3 作为列数,那么应该还有 3 个文本框来接收每个文本框的名称最后是列和数据类型以及主键和保存按钮。

这个 GUI 现在必须重复 4 次,因为在 Mainwondow.xaml 中,用户在启动时在“表数”选项中动态输入 4。因此,我们必须为“tableView.xaml”中的每个表条目重复此 GUI 4 次,这就是为什么我用 C# 编写代码来生成 GUI,在生成 GUI 后,我将从 C# 代码获得的 GUI 渲染到 tableView.xaml。现在你明白了吗?如果您知道使用 MVVM 执行此操作的任何其他方法,那么非常欢迎您给我一个小示例。 通过使用 C# 代码动态生成 GUI 意味着我必须执行以下操作:

现在,当我在 MainWindow.xaml 中收到用户输入为 4 时,我在 GUI 下重复 4 次(在大容器内的 for 循环中)并将其渲染到 tableView.Xaml (我在 C# 中执行此操作,因为我必须动态重复它根据用户在 MainWindow.xaml 表单中的选择)。

StackPanel stp = new StackPanel();
TextBlock txt1 = new TextBlock();
stp.Children.Add(txt1);  

此 stp 必须转到 tableView.xaml,并且必须渲染 4 个 stackpanel,每个 stackpanel 都包含文本块。


1)你的具体要求还不是很清楚,这使得回答这个问题非常困难。您说您想“关闭当前的 MainWindow.xaml 表单”,但您似乎表明您的 tableView 是 UserControl。您是否试图关闭 MainWindow 并将其完全替换为完全不同的窗口?如果是这样那还有什么意义呢?如果原始主窗口正在关闭,为什么不直接更改该窗口的内容呢?

2)这是一个很大的主题,您将不得不再次提供更多关于您想要做什么的信息,但通常您会使用数据模板。首先为要创建的 GUI 元素声明视图模型,以及包含它们列表的父 VM:

public abstract class GuiItem { } // base class

public class TextBlockVM : GuiItem { }
public class CheckBoxVM : GuiItem { }
public class TextBoxVM : GuiItem { }

public class CustomViewModel : ViewModelBase
{
    private GuiItem[] _GuiItems = new GuiItem[]
    {
        new TextBlockVM{},
        new CheckBoxVM{},
        new TextBoxVM{}
    };
    public GuiItem[] GuiItems { get { return this._GuiItems; } }
}

然后创建一个 ItemsControl,将 ItemsSource 绑定到数组,指定要在其上绘制它们的面板类型,并包含指定如何在 GUI 中对每个 VM 进行模板化的 DataTemplates:

<ItemsControl ItemsSource="{Binding GuiItems}" Margin="10">

    <ItemsControl.Resources>

        <DataTemplate DataType="{x:Type local:TextBlockVM}">
            <TextBlock Text="This is a TextBlock" />
        </DataTemplate>

        <DataTemplate DataType="{x:Type local:CheckBoxVM}">
            <CheckBox>This is a CheckBox</CheckBox>
        </DataTemplate>

        <DataTemplate DataType="{x:Type local:TextBoxVM}">
            <TextBox Width="100" HorizontalAlignment="Left"/>
        </DataTemplate>

    </ItemsControl.Resources>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

</ItemsControl>

Result:

显然,这是一个非常简单的示例,只是为了展示总体思路,在现实世界的应用程序中,您还可以向视图模型添加字段来指定文本和命令处理程序等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WPF 中使用 MVVM 从另一个视图打开一个视图 的相关文章

随机推荐

  • 每月第二个星期一的 Cron 表达式(对于 Hangfire)

    我正在尝试在 Hangfire 中创建定期作业 每月第二个星期一运行一次 如下所示 1 Monday May 14 2018 8 00 AM 2 Monday June 11 2018 8 0 AM 3 Monday July 9 2018
  • 在编译时检测编译器版本

    这既是一个问题 也是一个参考 我希望人们能够在此基础上进行构建 以便有类似问题的人可以重用它 我们如何可靠地检测 C C ObjC 编译器的特定版本 现在我知道了 Visual Studio 的答案 并部分知道了 Xcode 的答案 现在
  • JSF 1.2 startElement 和 writeAttribute 解释

    我有机会为我的项目编写一些自定义渲染器 并且运行得非常好 然而 我对 ResponseWriter 方法中的一些参数有些困惑 该文档没有很好地解释这一点 因此我希望一位常驻 JSF 专家可以更好地解释这一点 具体来说 public abst
  • 在 powershell 中使用 %userProfile% 环境变量创建路径时出现意外行为

    我编写了一个脚本来创建一系列符号链接 我想将目标值设置为 shortpath 其中 shortpath userprofile dir1 dir2 dir3 filename ext shortpath 变量的值是有效的 我可以从运行命令打
  • C - 将大写字母转换为小写字母

    一个非常简单的程序 我只想将 A 变成 a 但输出给了我 A include
  • 类 VS 引用结构

    我正在使用 C 编写游戏 因此 我非常关心性能 我想知道主要区别是什么 如果可能的话 使用类传递数据或通过引用传递结构的性能考虑因素 出于性能原因 我希望不要复制数据 我假设通过 ref 传递比这里通过值传递要快得多 我知道类始终通过引用传
  • MS 缺少 VSTO 4.0 运行时下载?

    我们有代码检查 VSTO 4 0 运行时是否存在并下载 如果丢失 直到今天这一切都运作良好 MS 中的 VSTO 运行时文件似乎丢失了 有人对这个有了解吗 我们能否告诉客户这是 MS 问题并且很快就会得到解决 Google 没有找到任何有关
  • Serialized 和 DataContract(不是对比?)

    我正在阅读我的新项目中的一些代码 发现前开发人员同时使用 Serialized 和 DataContract Serializable and DataContract Namespace Some Name Space IsReferen
  • iTerm2 隐藏标记

    我最近安装了 iTerm2 的 Shell Integration 但在输入 shell 命令时它还添加了那些小箭头 称为标记 这真的很烦人 有什么方法可以禁用 隐藏它们 我在网上找不到 As per 文档 https www iterm2
  • 让 IIS6 与 WordPress 完美配合

    我有一个由 WordPress 驱动的博客 我正在尝试在 IIS6 服务器上进行设置 除了令我头疼的永久链接结构之外 一切正常 在谷歌搜索 wordpress codex之后 我了解到这是因为IIS6没有相当于Apache的mod rewr
  • 如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接?

    在我的 Android 应用程序中 我有一个 WebView 我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序 如果有 否则在外部浏览器中打开 例如 如果用户从 WebView 中单击 Facebook 页面
  • Ninject - 找不到资源

    我收到错误 无法找到该资源 当我尝试在我的 MVC 3 应用程序中实现 Ninject 时 该问题似乎来自 Global asax 期间CreateKernel region Inversion of Control protected o
  • Postgres - python 多个 SSL 连接

    我在使用 psycopg2 和 SSL 建立两个并发 Postgres 数据库连接 一个到主数据库 一个到从数据库 时遇到问题 两个连接分别工作 即 import psycopg2 dsnMaster dbname sslcert path
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 多个 Access-Control-Allow-Origin 标头

    作为参考 我使用的是 Visual Studio 2017 和 Windows 10 我有一个 Web api 和带有用户帐户的相应 Web 应用程序 当我尝试登录时遇到一个错误 指出不存在 Access Control Allow Ori
  • 如何使用 JavaScript 将 HTML 转换为 XHTML?

    我需要在字符串中所有图像标签的末尾添加斜杠 我正在使用 JavaScript 正则表达式 这是我到目前为止所拥有的 strInput strInput replace
  • 计算编辑距离的最有效方法

    我刚刚实现了最佳匹配文件搜索算法来查找与字典中的字符串最接近的匹配项 对我的代码进行分析后 我发现绝大多数时间都花在计算查询与可能结果之间的距离上 我目前正在实现使用二维数组计算编辑距离的算法 这使得实现成为 O n 2 操作 我希望有人能
  • 在 Gulp 中将流与事件流连接时的顺序

    在此 Gulp 任务中 vendorFiles 代码放置在 dest style css 文件中的 appFiles 代码之后 这是因为 appFiles 流运行得更快吗 如何让vendorFiles代码按预期出现在前面 gulp task
  • 从线程内更新网页

    我有一个运行冗长过程的网页 除了在页面上显示进度之外 所有这些都在工作 我有以下进度条 引导程序 div class col md 8 div
  • 如何在 WPF 中使用 MVVM 从另一个视图打开一个视图

    我是 MVVM 新手 很长一段时间以来我都无法得到这个问题的答案 不知道是问题太难还是我没有解释清楚 我有 MainWindow Xaml 其中包含一个文本块和一个用于从文本块接收数据的按钮 现在当我按下按钮时 它应该打开第二个名为 tab