一尘不染

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

c#

我正在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);
    }

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


阅读 1445

收藏
2020-05-19

共1个答案

一尘不染

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

功能性:

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

就功能而言,就是这样

概念:

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

重要说明:* -在此示例中,用于DialogResult从模态窗口设置非DP 的方法不是MVVM友好cos,它使用代码隐藏来设置
避免DialogResultWindow.Closing事件的属性(如果需要“可测试”)。我偏爱的方法有点长,并且在此处(问题与答案的混合物)有很好的记录。因此,为什么为了这个示例而忽略它。
*

2020-05-19