使用内部命名空间和自定义命令设置CommandBinding的Command属性?

时间:2019-06-20 03:22:10

标签: wpf

我正在探索WPF,看看是否可以使用完整的MVVM方法。现在,我认为我需要学习如何引用我在附近的命名空间中定义的自定义对象/命令。

这是我的文件夹结构: enter image description here

这是我的XAML

MainWindow

这是我的using AppLogicCommandsAndQueries; using System.Windows; using WpfApp1.ViewModels; namespace WpfApp1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { Bootstrapper.Bootstrap(); InitializeComponent(); DataContext = new WordSearchViewModel(); } } } 背后的代码:

WordSearchCommand

这是我的using System; using System.Windows; using System.Windows.Input; namespace WpfApp1.Commands { public class WordSearchCommand : ICommand { private string previousSearch; public event EventHandler CanExecuteChanged = delegate (object s, EventArgs e) { MessageBox.Show("word search can execute changed"); }; public bool CanExecute(object parameter) { return previousSearch != (string)parameter; } public void Execute(object parameter) { // if online check online db else check offline db MessageBox.Show("word search command"); previousSearch = (string)parameter; } } } 定义:

WpfApp1\MainWindow.xaml(14,134,14,151): error CS1061: 'MainWindow' does not contain a definition for 'CanExecuteChanged' and no accessible extension method 'CanExecuteChanged' accepting a first argument of type 'MainWindow' could be found (are you missing a using directive or an assembly reference?)

我已经尝试过重建,切换CPU目标,切换到Release模式并返回等等。

这是我的构建输出中显示的错误:

<p:selectOneRadio id="customRadio" value="#{radioView.image}" layout="custom">
    <f:selectItem itemLabel="Image1" itemValue="Image1" />
    <f:selectItem itemLabel="Image2" itemValue="Image2" />
</p:selectOneRadio>
<h:panelGrid columns="2" cellpadding="5">
    <p:radioButton id="opt1" for="customRadio" itemIndex="0" />
    <h:graphicImage value="/some/image2.png"/>
    <p:radioButton id="opt2" for="customRadio" itemIndex="1" />
    <h:graphicImage value="/some/image2.png"/>
<h:panelGrid columns="3" cellpadding="5">

1 个答案:

答案 0 :(得分:0)

似乎我不太了解C#事件或WPF事件路由。通过更改CanExecuteChanged上的WordSearchCommand事件处理程序,我可以获得所需的行为。

在我之前:

public event EventHandler CanExecuteChanged = delegate (object s, EventArgs e)
{
    MessageBox.Show("word search can execute changed");
};

将永远不会执行(我从未看到消息框)。另外,CanExecute方法只会被调用一次。

现在,我有:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

现在我的CanExecute方法被称为一吨(开始时是一束,基本上在我与Window交互的任何时候?)。

我之前尝试添加事件访问器,但没有意识到我需要删除委托签名以使访问器定义在语法上有效。我肯定从RelayCommand定义以及StackOverflow上的其他文章中获得了启发。我仍然不太确定这里发生了什么,但是我偶然发现了我现在可以使用的解决方案。