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

我正在MVVM中进行第一个项目,因此我选择使用MVVM Light

Toolkit。我GameViewModel在游戏的主屏幕上可以处理业务。我需要找出如何在执行命令时AdventurerView使用实例Adventurer作为参数打开新窗口(),将其绑定到AdventurerViewModel,以及显示和返回数据。该窗口的实例将经常打开和关闭。我已经坚持了几天,这让我发疯。我想学习如何以MVVM友好的方式进行此操作,最好使用MVVM

Light或纯XAML提供的工具。

我试过使用MVVM

Light,ViewModelLocator但是由于AdventurerView它是一个窗口,因此无法使用;尽管程序仍在编译和运行,但它显示“无法以样式放置窗口”。我可以进行一些更改以使其正常工作吗?还是有其他方法可以将它们绑定到XAML中?还是完全采用另一种方法?我真的很希望能够继续前进。我也尝试过使用MVVM

Light的Messenger毫无用处(仍然无法解决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);

}

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

回答:

好吧,我整理了一个演示,它应该可以使您更轻松地下载链接

  • 3窗户在总(MainWindowModalWindowNonModalWindow
  • MainWindow有一个TextBox您可以输入任何内容。
  • 顶部的2个按钮将相应地打开“模态/非模态”窗口
  • 每个窗口在打开时都将TextBox在其TextBlock内部显示MainWindow中的消息。
  • 在每个窗口中,您都可以在中打勾a CheckBox来更新结果文本块中的值MainWindow(对于模态窗口,将在模态窗口关闭时启动。对于非模态更改,可以尽快看到)

就功能而言,就是这样

  • SimpleIoC和注册多个VM 并GetInstance(...)用于请求它们。
  • 使用自定义消息类型的Messenger类用法 OpenWindowMessage
  • 从父VM打开Modal / Non Modal Windows,这与MVVM原理保持一致
  • 在窗口之间传递数据(仅在NonModal中显示)

避免DialogResultWindow.Closing事件的属性(如果需要“可测试”)。我偏爱的方法有点长,并且在此处(问题与答案的混合物)有很好的记录。因此,为什么为了这个示例而忽略它。

*

以上是 MVVM Light和WPF-将窗口的多个实例绑定到ViewModel 的全部内容, 来源链接: utcz.com/qa/434536.html

回到顶部