如何使用 WPF 功能区菜单并在同一视图中显示以下内容?

How do I use a WPF Ribbon menu and display the content below in the same view?

我是 WPF、MVVM 和 Ribbon 的新手。 基本上,我可以成功构建功能区菜单,添加按钮,我了解 MVVM 概念。 现在我正在努力将以上所有内容结合起来:功能区菜单与 MVVM 模型。

更具体地说,我想知道如何实现以下内容: 假设您有一个带 2 个 "tabs" 的功能区菜单:一个用于客户功能(添加、搜索...),一个用于库存管理(搜索库存、管理库存...)。

现在,每次我单击一个按钮(比如说功能区菜单中 "search customers" 的按钮),我希望显示一个搜索表单和下面的搜索结果,但不是在新的看法。 我想让它显示在同一个 view/window 中,但在功能区菜单下方。 因此,每次在功能区菜单中触发新的 "functionality" 时,我都想让它显示在同一个 window/view 中,一遍又一遍地重复使用我的主要 view/window。

我该如何实现这一点,基本上是 "updating" 主要 window 每次在带有新内容的功能区中单击新按钮时?

我用谷歌搜索了这个,我发现了各种教程和代码示例,它们要么只是演示构建功能区菜单(没有 MVVM 概念),要么只是演示 MVVM 概念但没有功能区菜单,...但是看在我的份上,我无法理解如何实现我上面描述的内容...

一般来说,当您想要更改内容时,您的视图中会有类似视图占位符的东西。这可能是完全不同的东西,例如 Itemscontrol(对于多个内容、一个 ContentPresenter 或只是一个文本块)

对于您的问题,我认为您可以简单地使用 ContentPresenter:

示例视图:

<UserControl x:Class="WpfApplication1.View.SampleVIew"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <DockPanel>
        <!--Ribbon Menu-->
        <Menu DockPanel.Dock="Top" />

        <!--Your Content to Change-->
        <ContentPresenter Content="{Binding CurrentContent}" />
    </DockPanel>
</UserControl>

(而不是那个菜单,你有你的功能区。) 然后在你的 Viewmodel 中你有一个 ViewModel 属性

ViewModelBase _currentContent;
public ViewModelBase CurrentContent
{
    get { return _currentContent; }
    set
    {
        _currentContent = value;
        RaisePropertyChanged(nameof(CurrentContent));

    }
}

Raise属性Changed 方法只是引发 INotify属性Changed 接口的 属性Changed 事件,当你说你理解 mvvm 模式时,你认为你知道这一点。

然后在 RibbonButton 的方法中,只需将 CurrentContent 属性 更改为不同的 ViewModel。

public void MyCommandMethod()
{
    this.CurrentContent = new DifferentViewModel();
}

ViewModel 应该通过 DataTemplates 映射到视图,例如:

    <DataTemplate DataType="{x:Type my:DifferentViewModel}">
        <local:MyUserControlForDifferentView />
    </DataTemplate>

编辑:

我在开始使用 wpf 时找到的最好的教程是 Josh Smith 的文章: this