当前位置: 首页 > 编程语言 > C#

如何在WPF中绑定命令分享

时间:2023-04-10 19:53:38 C#

如何在WPF中绑定命令有时我们会多次使用复杂的方法,以至于忘记了最简单的方法来完成一项任务。我知道如何进行命令绑定,但我总是使用相同的方法。创建一个实现ICommand接口的类,并从视图模型中创建该类的一个新实例,绑定就像一个魅力。这是我的命令绑定代码publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();数据上下文=这个;testCommand=newMeCommand(处理器);}ICommand测试命令;公共ICommand测试{得到{返回testCommand;}}publicvoidprocessor(){MessageBox.显示(“你好世界”);}}publicclassMeCommand:ICommand{publicdelegatevoidExecuteMethod();私有ExecuteMethod方法;publicMeCommand(ExecuteMethodexec){meth=exec;}publicboolCanExecute(objectparameter){returnfalse;}公共事件EventHandlerCanExecuteChanged;publicvoidExecute(objectparameter){meth();但我想知道这样做的基本方法,没有3rdpartydll没有新类创建。使用单个类来执行这个简单的命令绑定。实际类从ICommand接口实现并完成工作。Prism已经提供了Microsoft.Practices.Prism.Commands.DelegateCommand我不确定它是否被视为第三方。至少它是官方的并且记录在MSDN上。一些本机内置命令(例如复制和粘贴)实现了ICommand接口。恕我直言,它遵循开放(扩展)/封闭(更改)原则。这样我们就可以实现自己的命令了。更新由于WPF命令记录在此处,摘录...WPF提供了一组预定义的命令。例如Cut、BrowseBack和BrowseForward、Play、Stop和Pause。如果命令库类中的命令不能满足您的需要,您可以创建自己的命令。有两种方法可以创建自定义命令。第一种是从头开始实现ICommand接口。另一种更常见的方法是创建RoutedCommand或RoutedUICommand。我一开始尝试了RoutedCommand模型,最后实现了ICommand。示例XAML绑定RoutedCommand与RoutedEvent没有什么不同。这似乎是一个更好的按钮“单击”事件处理程序。其目的:将应用程序逻辑与View分开,但需要一些额外的DependencyProperty或代码隐藏。我个人觉得只需要实现我的ICommand就更舒服了。我倾向于内置RelayCommand的MVVMLighthouse。您将ICommand属性添加到视图模型,然后为其分配中继命令:-ICommandClickMeCommand{get;set;}privatevoidInitCommands(){ClickMeCommand=newRelayCommand(()=>HasBeenClicked=true);//或者ClickMeCommand=newRelayCommand(ClickMeEvent);}publicvoidClickMeEvent(){HasBeenClicked=true;在xaml中,您只需使用普通绑定:-如果您不想创建新类,请使用路由命令。这是一个小片段。我创建了一个路由命令作为保存并将其绑定到命令绑定窗口,从按钮中提取命令。看!我希望这可以帮助你publicpartialclassWindow1:Window{publicstaticreadonlyRoutedCommandFoo=newRoutedCommand();publicWindow1(){InitializeComponent();}voidFoo_CanExecute(objectsender,CanExecuteRoutedEventArgse){//Window确定此时是否可以执行Foo命令。e.CanExecute=true;}voidFoo_Executed(objectsender,ExecutedRoutedEventArgse){//Window在用户想要Foo时执行命令逻辑。MessageBox.Show("TheWindowisFooing...");我希望我理解你的问题。PS:命令设计模式的需要是将执行逻辑和命令调用者分开。所以Command类是一种封装逻辑的方式。如果不在VS中运行代码来判断,您的问题是您调用了InitializeComponent(呈现XAML),然后在测试属性中设置了没有任何值的DataContext,最后设置了一个私有成员。UI如何注意到您的命令不再为空(这是它在属性中找到的最后一个值)?为什么不像这样延迟执行命令:publicICommandtest{get{if(testCommand==null){testCommand=newMeCommand(processor);}返回测试命令;}}以便它在需要时立即存在并且您不需要更改通知(除非您稍后在运行时更改命令)。顺便说一句,在命令绑定场景中,有几个地方可以感觉到没有代码在执行:1)CanExecute()返回false:返回true或根据您的业务案例进行评估。2)CanExecute的条件发生变化,因此它将返回true,但不会被调用:您可以使用CommandManager类暂停命令,请参见此处。在尝试之前确保1)已解决。这确保您的UI将频繁地重新查询CanExecute,如果仍然不够,请显式调用MethodCommandManager.InvalidateRequerySuggested()。3)你的绑定是错误的。像这样更改绑定代码:Command="{BindingPath=test,PresentationTraceSources.TraceLevel=High}"这将在拉出或推送绑定值时向输出窗口发送垃圾邮件。请注意术语“使用最终值”。如果它为空,则该命令不在它应该在的位置(还)。好吧,你几乎拥有它。只要确保CanExecute()将返回true,否则您的代码将不会被执行。(我认为它实际上会,但仍然)。还要确保将“NotifyPropertyChanged('yourCommand')”添加到publicICommandtest{get{returntestCommand;}设置{testCOMmand=值;NotifyPropertyChanged("测试");}}到这里。你也可以做test=newMeCOmmand();数据上下文=这个;在WPF窗口构造函数中,要链接键盘快捷方式,只需使用委托添加绑定,并将其与按键手势相关联。publicYourWindow()//你的构造函数{...//绑定键盘命令快捷键InputBindings.Add(newKeyBinding(//添加一个新的键绑定,将它绑定到你的命令对象,它接受一个委托newWindowCommand(this){ExecuteDelegate=TogglePause//用你的方法委托替换TogglePause},newKeyGesture(Key.P,ModifierKeys.Control)));...}创建一个简单的WindowCommand类,它接受一个执行委托来触发它设置的任何方法。以上就是《C#学习教程:如何在WPF中绑定命令》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassWindowCommand:ICommand{privateMainWindow_window;publicActionExecuteDelegate{得到;放;}publicWindowCommand(MainWindowwindow){_window=window;}publicboolCanExecute(objectparameter){returntrue;}公共事件EventHandlerCanExecuteChanged;publicvoidExecute(objectparameter!=Delegate(Executenull){ExecuteDelegate();}else{thrownewInvalidOperationException();}}}本文收集自网络,不代表立场,如涉及侵权,敬请谅解点击右边联系管理员删除,如需转载请注明出处: