gpt4 book ai didi

wpf - 处理应用程序范围的命令

转载 作者:行者123 更新时间:2023-12-03 10:19:57 25 4
gpt4 key购买 nike

我正在对 WPF 和 MVVM 进行一些研究,以评估这是否是我们希望在项目中实现的东西。

有一件事我完全不能理解(我关于 WPF 的书还没有到)。

我已经阅读了 Josh Smith 的文章 'WPF Apps With The Model-View-ViewModel Design Pattern' 以及他的文章 'Using RoutedCommands with a ViewModel in WPF'。

我的演示应用程序与 Josh Smith 的演示有些不同,因为我的菜单项不直接绑定(bind)到主视图模型,而是由其他 View 模型处理。

我的主窗口绑定(bind)到一个 MainViewModel 对象,该对象公开了一个名为 View 的对象(从 ViewModelBase 类派生并通过 ContentControl 绑定(bind)到主窗口)。这个 View 对象被替换为不同的 ViewModel,例如 CustomerViewModel、CustomersViewModel 等(这些是使用我的资源字典中定义的 View 呈现的:)。

所有这一切都很好并且可以找到,但是由于我不想在我的主窗口中的菜单项(例如新建、保存等)根据我找到的 View 禁用应该启用的菜单项,我发现 Josh Smith 的关于 CommandSink 模式的文章(?)但他说它已经过时了,应该使用 RelayCommand。

现在我很困惑,因为我无法弄清楚如何使用这种方法来实现这个功能。

谢谢,
文森特

最佳答案

一个简单的方法是让每个 View 都暴露一个 MenuItem 类型的属性。 ,其中包含其本地菜单。 (菜单本身可以存在于 View 的资源字典中;您只需实现一个使用 FindResource 检索它的属性 getter。)

然后让你的主菜单看起来像这样:

<Menu>
<MenuItem Header="File">
<!-- content for your application's File menu goes here -->
</MenuItem>
<MenuItem Header="Edit">
<!-- content for your application's Edit menu goes here -->
</MenuItem>
<MenuItem Header="{Binding SelectedView.MenuItem.Header}"
ItemsSource={Binding SelectedView.MenuItem.Items}/>
<MenuItem Header="Help">
<!-- content for your application's Help menu goes here -->
</MenuItem>
</Menu>

编辑

我想我误解了你的问题,但部分原因是我认为你的问题比我认为你问的更容易回答。

创建 RoutedCommand应用程序 View 模型中名为 DisabledCommand 的属性那总是被禁用的。然后将您的应用程序菜单绑定(bind)到如下命令:
public RoutedCommand SaveCustomerCommand
{
get
{
CustomerView cv = SelectedView as CustomerView;
return cv == null
? DisabledCommand;
: ((CustomerViewModel)cv.DataContext).SaveCommand;
}
}

Actor 阵容看起来有点尴尬,但除此之外,这很简单,甚至很优雅。您的应用程序 View 需要了解的有关客户 View 的唯一实现细节是有一个 SaveCommand在其 View 模型上。

关于wpf - 处理应用程序范围的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com