MVVM Light & WPF - 将窗口的多个实例绑定到 ViewModel

2024-01-20

我正在 MVVM 中开发我的第一个项目,并且我选择使用 MVVM Light Toolkit。我有一个GameViewModel在我的游戏主屏幕上处理业务。我需要了解如何打开一个新窗口(AdventurerView)与一个实例Adventurer作为执行命令时的参数,将其绑定到AdventurerViewModel,并显示并返回数据。此窗口的实例将频繁打开和关闭。我已经被这个问题困扰了好几天了,这让我发疯。我想学习如何以 MVVM 友好的方式执行此操作,最好使用 MVVM Light 或纯 XAML 提供的工具。

我尝试过使用 MVVM LightViewModelLocator但是由于AdventurerView是一个窗口,它不起作用;它说“无法将窗口放入样式中”,但程序仍然可以编译并运行。我可以改变一些东西来使其发挥作用吗?或者有其他方法在 XAML 中绑定它们吗?或者完全是另一种方法?我真的很希望能够继续前进。我也尝试过使用 MVVM Light 的信使,但没有成功(仍然没有解决 View/ViewModel 问题)。

我只需要能够创建一个绑定到的窗口AdventurerViewModel并显示/返回适当的数据。

AdventurerView.xaml 目前处于默认状态,但我觉得如果我可以绑定适当的数据可能会有所帮助(DataContext)。

AdventurerViewModel 也非常简单

class AdventurerViewModel : ViewModelBase
{
    #region Members

    private Adventurer _adv;

    #endregion

    #region Properties

    public Adventurer Adv
    {
        get { return _adv; }
        set { _adv = value; }
    }

    #endregion

    #region Construction

    public AdventurerViewModel(Adventurer adv)
    {
        this._adv = adv;
    }

    #endregion
}

App.xaml 底部带有不工作的 DataTemplate:

<Application StartupUri="MainWindow.xaml"
         xmlns:views="clr-namespace:AoW.Views"
         xmlns:vm="clr-namespace:AoW.ViewModels" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Class="AoW.App" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         mc:Ignorable="d">

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

    <DataTemplate DataType="{x:Type vm:GameViewModel}">
        <views:GameView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:TitleViewModel}">
        <views:TitleView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:AdventurerViewModel}">
        <views:AdventurerView />
    </DataTemplate>

</Application.Resources>
</Application>

命令在GameViewModel这有望使这一切发生(消息框只是确认该命令正在触发):

    private void ExecuteShowAdvCommand(Adventurer adv)
    {
        System.Windows.MessageBox.Show(adv.Name);
    }

我真的不知道还要包括什么。


好的,我整理了一个演示,希望可以让您更轻松地完成此操作下载链接 https://www.dropbox.com/s/h3ie0pa7sqi18ql/MultiWindowMvvmLight.rar

功能:

  • 总共 3 个窗口 (MainWindow, ModalWindow, NonModalWindow)
  • MainWindow has a TextBox你可以输入任何你想要的内容。
  • 顶部的 2 个按钮将相应地打开模态/非模态窗口
  • 每个窗口打开时都会显示主窗口中的消息TextBox in a TextBlock在他们里面。
  • 在每个窗口中您可以勾选CheckBox更新结果文本块中的值MainWindow(对于模态窗口,这将在模态窗口关闭时启动。对于非模态窗口,可以尽快看到更改)

功能上就是这样,

概念:

  • 注册多个虚拟机SimpleIoC并使用GetInstance(...)要求他们出去。
  • 具有自定义消息类型的 Messenger 类用法OpenWindowMessage
  • 从父 VM 打开模态/非模态窗口,始终遵循 MVVM 原则
  • 在窗口之间传递数据(仅在 NonModal 中显示)

重要的提示:- 本例使用的方法设置非DPDialogResult模态窗口对 MVVM 不友好,因为它使用代码隐藏来设置DialogResult财产在Window.Closing事件其中should避免(如果需要“可测试”)。我首选的方法有点长并且有很好的文档记录HERE https://stackoverflow.com/questions/3801681/good-or-bad-practise-for-dialogs-in-wpf-with-mvvm(问题和答案的混合)。这就是为什么我为了这个样本而忽略它。

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

MVVM Light & WPF - 将窗口的多个实例绑定到 ViewModel 的相关文章

  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 运行 Azure 函数时路径中存在非法字符

    我有一个 Azure 函数 它已经运行了一整天 大约二十分钟前 当我尝试单击 Visual Studio 中的运行按钮时 开始出现错误 它成功构建 然后在启动时显示并错误 仅指出 路径中的非法字符 Visual Studio 我检查了 gi
  • SWIG Python C++ 结构作为输入/输出参数

    老实说 我在这个网站上读了很多关于struct主题 但我需要你的帮助 我有 C 风格的结构 struct Time uint16 t year year with four digits like 2016 uint8 t month 1
  • 将海量列表传递给 MVC3 中的 View

    ASP NET MVC 新手 现在使用 MVC3 和 Razor 我对将对象从控制器传递到视图感到困惑 具体来说 我正在尝试 MVC3 和 Rob Conery 有趣的 Massive http blog wekeroad com help
  • 使用加密c#导出PKCS8中的CngKey

    如何将 CngKey 导出到 PKCS 8 并加密 static void Main string args CngKeyCreationParameters ckcParams new CngKeyCreationParameters E
  • 如何将列表复制到数组

    我有导游名单 List
  • 无法将“RSACng”类型的对象转换为“System.Security.Cryptography.RSACryptoServiceProvider”类型

    我得到了这个异常 无法将 RSACng 类型的对象转换为 System Security Cryptography RSACryptoServiceProvider 类型 调用这个方法 GoogleCredential cred Googl
  • 空 catch 与 try-catch 语句中的“catch Exception”相同吗?

    try catch Exception 我可以写吗 try catch 这在 C NET 3 5 中可以吗 代码看起来更好 但我不知道是否相同 他们是not一样的 catch Exception 将仅捕获托管异常 catch 也会捕获非 C
  • 类继承通用字典和Interface

    我有一个继承通用字典和接口的类 public class MyDictionary Dictionary
  • 为什么 C# 中 Encoding.ASCII != ASCIIEncoding.Default ?

    为什么 C 中 Encoding ASCII ASCIIEncoding Default 这是因为ASCIIEncoding源自于Encoding where Default定义为
  • 如何使用 Git 子模块和 CMake 处理传递依赖冲突?

    我们有许多 Git 存储库 有些包含我们自己的代码 有些包含稍作修改的第三方库代码 简化的依赖图如下所示 executable A v library B v v library C 所以可执行文件有两个依赖项library C 一种是直接
  • 处理长时间运行的报告

    我正在开发一个用 C 和 Sql Server 2000 数据库编写的 ASP net 应用程序 我们有多个 PDF 报告供客户用于满足其业务需求 问题是这些报告需要一段时间才能生成 gt 3 分钟 通常最终发生的情况是 当用户请求报告时
  • 除法未输出正确答案c++

    我是 C 新手 我正在尝试编写一个基本的数学程序来热身于该语言 当我尝试解决 9 2 问题或任何带有小数的问题时 答案似乎是错误的 我想要 4 50 的输出 但我一直得到 4 00 造成这种情况的原因是什么以及如何预防 谢谢 double
  • xamarin.forms 从 xaml 到属性的绑定

    我是一个 xaml 绑定的新手 有时我真的不明白 我的 xaml 中有这个
  • 将不同的单词保存到链接列表中

    基本上我这里有两个链接列表 列表和不同的 有几组单词之前已保存到 列表 结构中 我要编写一个程序 它会找到不同 唯一的单词并将其保存到 不同 结构中 这是我到目前为止根据我的指针概念得到的结果 然而 当我尝试打印 distinct 时 程序
  • fgetc 无法识别 EOF [重复]

    这个问题在这里已经有答案了 下面的程序在各种 Solaris Linux 版本上运行良好 但在 AIX 上运行不佳 但是 如果我更换while c EOF with while c 0xff 在 AIX 上它运行得很好 有什么想法吗 我检查
  • 在业务逻辑中使用反射是一种好的做法吗?

    我需要开发一个由两个主要部分组成的应用程序 具有特定业务类别的业务逻辑部分 例如书籍 图书馆 作者 一个通用部分 可以在数据网格中显示书籍 图书馆 将它们映射到数据库 通用部分使用反射从业务类中获取数据 而不需要在业务类中编写特定的数据网格
  • 在 VB.NET 中将类标记为静态

    正如刚刚在最近的一篇文章中所说question https stackoverflow com questions 135759 why cant i inherit iodirectory and answer https stackov
  • 游戏网络射弹实施/概念问题[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试找到某种解决方案来解决同步射弹射击和游戏网络的常见问题 但我不确定什么是最合适的 这是一款 2D 动作横向卷轴游戏 带有多个射弹 没有即时攻
  • .NET 3.5 和 .NET 4.5 之间的多重绑定发生了什么?

    我们目前正在将项目从 NET 版本 3 5 转换为版本 4 5 我们使用多重绑定转换器设置了一个文本框 IsEnabled 标记 每个绑定都有自己的转换器 所有这些在 NET 3 5 中都运行良好 但在 NET 4 5 中 传递给子转换器的

随机推荐