如何从MainWindow调用XAML中的方法?

时间:2020-04-28 17:48:56

标签: c# wpf xaml

我正在尝试从MainWindow.xaml.cs调用MainWindow.xaml中的方法。 我在任何地方都找不到它将如何工作。

例如,假设我的xaml代码中包含KeyBinding,并且我想在按下CTRL + E时按下// comments omitted [HttpGet("{seasonKey}")] [ProducesResponseType(typeof(See2Season), 200)] public async Task<IActionResult> GetSeasonByKeyAsync( string seasonKey, [FromQuery(Name = "provider")] string providers, [FromQuery(Name = "lang")] string languages, [FromQuery(Name = "priority")] string priority) { var sanitizedSee2Params = ParametersHelper.ProcessAndSanitizeSee2InputParams( this._logger, true, new KeyValuePair<string, string>(InputParameterNames.PROVIDERS, providers), new KeyValuePair<string, string>(InputParameterNames.LANGUAGE, languages), new KeyValuePair<string, string>(InputParameterNames.PRIORITY, priority)); var result = await this._seasonManager.GetSeasonByKeyAsync( seasonKey, sanitizedSee2Params).ConfigureAwait(false); return this.Ok(result); } // comments omitted [HttpGet("{seasonKey}/children")] [ProducesResponseType(typeof(IEnumerable<See2Content>), 200)] public async Task<IActionResult> GetSeasonChildrenByKeyAsync( string seasonKey, [FromQuery(Name = "overrideDefaultDirection")] bool overrideDefaultDirection, [FromQuery(Name = "provider")] string providers, [FromQuery(Name = "lang")] string languages, [FromQuery(Name = "priority")] string priority) { var sanitizedSee2Params = ParametersHelper.ProcessAndSanitizeSee2InputParams( this._logger, true, new KeyValuePair<string, string>(InputParameterNames.PROVIDERS, providers), new KeyValuePair<string, string>(InputParameterNames.LANGUAGE, languages), new KeyValuePair<string, string>(InputParameterNames.PRIORITY, priority)); var result = await this._seasonManager.GetSeasonChildrenByKeyAsync( seasonKey, overrideDefaultDirection, sanitizedSee2Params).ConfigureAwait(false); return this.Ok(result); } 被调用。

MethodIWantToCall
<Page x:Class="Example"
      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" 
      xmlns:local="clr-namespace:Example"
      mc:Ignorable="d">
<Page.InputBindings>
        <KeyBinding Command="{Binding MethodIWantToCall}" Gesture="Ctrl+E"/>
</Page.InputBindings>
</Page>

当然,当我运行代码并按Ctrl + E时,将不会发生任何事情。 如果我将Method放在其他类中会起作用,但是在我的情况下,我需要将它作为xaml后面的Page。

1 个答案:

答案 0 :(得分:0)

命令不仅仅是方法,它们实际上是类。具体来说,它们是实现ICommand接口的任何类的实例。 “命令”类具有一个Execute方法(实际上可以执行该操作),以及一个可选的CanExecute来确定当前是否可以执行该命令。

这是有关以下命令的WPF文档:Commanding Overview

这主要集中在RelayCommand上,它是WPF命令的实现,其功能与RoutedEvent相似。另一种选择是使用“ RelayCommand”(也称为“ DelegateCommand”)。 RelayCommand实际上不是任何标准.NET库的一部分,但它是一个简单的常用类。您可以在this answer中找到它的隐含内容。

这里是一个问题,讨论了何时/为何在RoutedCommand上使用RelayCommand,反之亦然:WPF ICommand vs RoutedCommand。我在不同的时间都亲自使用过。

总结:您需要在Example中定义一个自定义命令,该命令在执行时将调用MethodIWantToCall。实现方式会有所不同,具体取决于您选择使用RelayCommand还是RoutedCommand

相关问题