从不同的视图模型向主窗口传递命令



我是WPF的新手,正在学习更多关于MVVM的知识,但我遇到了一个问题。因此,我的mainwindow.xaml及其代码和实现主要基于视图模型FileMenuCommands,现在我创建了另一个名为AboutMenuCommands的视图模型,我想从这里向主窗口传递一个命令(帮助命令(,但当我尝试这样做时,编译器找不到我的函数。

为了从XAML中的另一个视图模型传递命令,我需要做什么?

来自主窗口的代码:

<Window x:Class="Notepad___.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Notepad___.ViewModel"
mc:Ignorable="d"
Title="Notepad+++" Height="450" Width="800">
<Window.DataContext>
<local:FileMenuCommands/>
</Window.DataContext>
<Window.InputBindings>
<KeyBinding Key="O" Modifiers="Ctrl" Command="{Binding Path=Open}" />
<KeyBinding Key="N" Modifiers="Ctrl" Command="{Binding Path=New}" />
</Window.InputBindings>
<Grid>
<Menu Name="MainMenu" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Top">
<MenuItem Header="_File" FontSize="14" >
<MenuItem Header="_New" InputGestureText="Ctrl+N" Command="{Binding Path=New}">
<MenuItem.ToolTip>
<ToolTip>Create a new file.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="Open" InputGestureText="Ctrl+O" Command="{Binding Path=Open}">
<MenuItem.ToolTip>
<ToolTip>Open a file.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="_Save" InputGestureText="Ctrl+S">
<MenuItem.ToolTip>
<ToolTip>Saves a file in the current location if it already exists, if not creates a prompt.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="_Save As" Command="{Binding Path=SaveAs}">
<MenuItem.ToolTip>
<ToolTip>Saves the file in the location prompted by the user in the format they desire.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="_Exit" InputGestureText="Ctrl+X">
<MenuItem.ToolTip>
<ToolTip>Exits the application.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
</MenuItem>
<MenuItem Header="_Search" FontSize="14" >
<MenuItem Header="_Find" InputGestureText="Ctrl+F">
<MenuItem.ToolTip>
<ToolTip>Finds the occurences of the input word / set of characters.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="_Replace" InputGestureText="Ctrl+R">
<MenuItem.ToolTip>
<ToolTip>Replaces the input word / set of characters.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
<MenuItem Header="_Replace All" >
<MenuItem.ToolTip>
<ToolTip>Replaces all the occurences of the input word / set of characters.</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
</MenuItem>
<MenuItem Header="_Help" FontSize="14" Command="{Binding Source=Help}"> // this is where i'm trying to pass my command from another xaml
<MenuItem Header="_About" >
<MenuItem.ToolTip>
<ToolTip>A few words about the application and who made it</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
</MenuItem>
</Menu>

AboutMenuCommand.cs

using Notepad___.View;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Input;
namespace Notepad___.ViewModel
{
class AboutMenuCommands
{
private ICommand m_help;
private void HelpPage(object parameter)
{
var aboutPage = new About();
aboutPage.ShowDialog();
}
public ICommand Help
{
get
{
if (m_help == null)
m_help = new RelayCommand(HelpPage);
return m_help;
}
}
}
}

MainWindowViewModel应该从about页面获取视图模型实例。about命令应该在MainWindowViewModel中实现,并从about页面调用视图模型。

几个月前,我遇到了这样的问题,并提出了一个mvvm框架,它确实有助于理解mvvm的原理。

但我不想把控制权交给一个我无法研究的框架,所以我找到了mvvmgen。

因此,看看mvvmgen中的文档,您就会找到mvvm问题的答案。

最新更新