【发布时间】:2020-06-25 20:15:22
【问题描述】:
对于 WPF ICommand,事件处理程序 -= 的等价物是什么?
我们有一个用户控制按钮,用于管理提交购买请求的功能,但需要用户先在工作站上注册。
WinForms的用法是:
this.Click -= this.btnRegister_Click;
this.Click -= this.btnSubmit_Click;
WPF 中的现代化版本具有单个 ICommand 属性和典型声明。
public ICommand ClickCommand { get; set; }
....
ClickCommand = new DelegateCommand(RegisterClicked);
一旦用户注册,用户控件将重新初始化到提交过程。存在一个简单的触发器来检查按钮的状态。从视觉上看,触发器工作正常,这表明程序正在处理初始化代码块。
<Label.Style>
<Style TargetType="Label" BasedOn="{StaticResource ButtonLabel}">
<Setter Property="Content" Value="Approvals"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ButtonState}" Value="{x:Static locdata:WorkflowButtonState.Register}">
<Setter Property="Content" Value="Register"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=ButtonState}" Value="{x:Static locdata:WorkflowButtonState.Submit}">
<Setter Property="Content" Value="Submit"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
初始化代码块
private void InitRegister()
{
ButtonState = WorkflowButtonState.Register;
ClickCommand = new DelegateCommand(RegisterClicked);
}
private void InitSubmit()
{
ButtonState = WorkflowButtonState.Submit;
ClickCommand = new DelegateCommand(SubmitClicked);
}
private void Reset()
{
ClickCommand = null;
ButtonState = WorkflowButtonState.Default;
}
调试模式清楚地表明 ClickCommand 执行方法是 SubmitClicked,但是 RegisterClicked 事件仍然会触发。这只发生在注册过程首先发生时,因为用户之前没有登录过工作站。
由于设置 ClickCommand = null 没有帮助,复制 EventHandler -= 行为需要什么?
更新
到目前为止,我的应用程序中的 ICommand 用法一直是单次使用。正如安迪的回答所说,它应该被视为一个属性并引发属性更改事件。
更新后的 ICommand 声明,正如我多次为属性所做的那样,所有需要改变的地方。
private ICommand _clickCommand;
public ICommand ClickCommand { get => _clickCommand; set { _clickCommand = value; OnPropertyChanged(); } }
【问题讨论】:
-
在你的问题结束时,你有点迷失了我。你能否澄清最后两段,或者包括一个可重现的例子?
标签: wpf eventhandler icommand delegatecommand