在 WPF 中实现预定义的打开命令

Posted

技术标签:

【中文标题】在 WPF 中实现预定义的打开命令【英文标题】:Implement predefined Open Command in WPF 【发布时间】:2019-05-13 00:15:43 【问题描述】:

如何将我自己在 MyOpenCommand.cs 中名为 MyOpenCommand 的书面 Open Command 绑定到 WPF 提供的预定义 Open Command?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace DokumentViewerSample.Commands

    class MyOpenCommand : ICommand
    
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        
            return true;
        

        public void Execute(object parameter)
        
            //Some opening logic!
        
    

通常,我会在 Window.Resources 中创建一个引用来定义一个键, 类似:

 <Window.Resources>
       <local:MyOpenCommand x:Key="cmd1" />
    </Window.Resources>

最后将命令绑定到控件的命令属性上。

但是我怎样才能使用预定义的打开命令呢?我知道,我可以定义 BindingResources。类似的东西:

 <Window.CommandBindings>
        <CommandBinding Command="Open" CanExecute="Some_Handler"
                            Executed="Some_Handler2"></CommandBinding>
 </Window.CommandBindings>

但是在这里我会在 MainWindow.xaml.cs 文件中创建回调方法,我感觉这是不对的。

如果您能向我展示最佳实践版本,我将非常感激(:

感谢您的宝贵时间!

【问题讨论】:

您想稍后通过 Windows 中的控件使用该命令吗? 是的!我想要一个控件来使用它 打开一个命令。 MyOpenCommand 是另一个。你想做什么?您不能用自己的命令替换 Open 命令,但您可以处理正在引发的 Open 命令。 【参考方案1】:

如果我想使用来自控件的命令,我通常会在视图模型中定义它。

public class ViewModel

    public MyOpenCommand MyCommand  get; set;  = new MyOpenCommand();
//...

然后设置视图模型

public MainWindow()

        InitializeComponent();

        DataContext = new ViewModel();            
 

比我能够设置命令绑定像:

<Grid>
    <Button Content="Open" Command="Binding MyCommand"></Button>
</Grid>

顺便说一下,MyOpenCommand 类必须设置为 public。

如果你想使用 CommandBindings,可以看看 Matt Hamilton 的文章: matthamilton.net/commandbindings-with-mvvm

【讨论】:

是的,我知道,但这并不是我想知道的。我想知道如何使用预定义的 ApplicationComands.Open 并将 MyOpenCommand 类中的方法(CanExecute 和 Execute)绑定到 EventHandler?因为我不想将方法定义和逻辑存储在 mainwindow.xaml.cs (: 我认为在这种情况下,艺术 matthamilton.net/commandbindings-with-mvvm 可能会有所帮助

以上是关于在 WPF 中实现预定义的打开命令的主要内容,如果未能解决你的问题,请参考以下文章

WPF中的自定义热键

在 SDK 中实现自定义取消按钮

Unity中实现自定义脚本模版

在python的自定义类中实现'with object() as f'的使用

在 iOS 中实现 - 带有自定义标记器的 Android MultiAutoCompleteTextView,如 Whatsapp [附加图片]

WPF 中的键盘快捷键