首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICommand等价于Click -= Button_Click

ICommand等价于Click -= Button_Click
EN

Stack Overflow用户
提问于 2020-06-25 20:15:22
回答 1查看 126关注 0票数 0

对于WPF ICommand,事件处理程序-=的等效值是什么?

我们有一个用户控制按钮,它管理提交购买请求的功能,但要求用户首先在工作站上注册。

WinForms的用法是:

代码语言:javascript
复制
this.Click -= this.btnRegister_Click;
this.Click -= this.btnSubmit_Click;

WPF中的现代化版本只有一个ICommand属性和典型的声明。

代码语言:javascript
复制
public ICommand ClickCommand { get; set; }
....
ClickCommand = new DelegateCommand(RegisterClicked);

一旦用户注册,用户控件将重新初始化到提交进程。存在一个检查按钮状态的简单触发器。从视觉上看,触发器工作得很好,这表明程序正在处理初始化代码块。

代码语言:javascript
复制
<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>

初始化代码块

代码语言:javascript
复制
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事件仍然会触发。这仅在因为用户以前没有在工作站上登录而首先发生注册进程时才会发生。

由于设置EventHandler = null没有帮助,所以复制-=行为需要什么?

更新

到目前为止,在我的应用程序中,ICommand的使用只是一个单一的用途。正如Andy的回答所指出的,它应该被视为一项财产,并引发财产变更事件。

更新后的ICommand声明,正如我多次对属性所做的那样,所有需要更改的内容都已更改。

代码语言:javascript
复制
private ICommand _clickCommand;
public ICommand ClickCommand { get => _clickCommand; set { _clickCommand = value; OnPropertyChanged(); } }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 09:07:52

这里有两件事要考虑:

  1. 按钮上的命令不是事件,而是依赖项属性。https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.primitives.buttonbase.command?view=netcore-3.1

  1. 如何区分视图中的依赖项属性,即它的值应该再次从视图模型中读取?

你通知财产变更。

一些示例标记:

代码语言:javascript
复制
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <StackPanel>
        <Button Command="{Binding TestCommand}" Content="Test"/>
        <Button Command="{Binding ChangeCommand}" Content="Change Test Command"/>
    </StackPanel>
</Window>

有一个测试命令,它从一个命令开始,然后单击change test命令按钮,它将更改为另一个命令。

我的视图模型:

代码语言:javascript
复制
    public class MainWindowViewModel : BindableBase
    {
        private DelegateCommand testCommand;
        public DelegateCommand TestCommand 
        {
            get => testCommand;
            set { testCommand = value; RaisePropertyChanged(); }
        }
        public DelegateCommand ChangeCommand { get; set; }
        public MainWindowViewModel()
        {
            TestCommand = new DelegateCommand(() => { MessageBox.Show("Original Command"); });
            ChangeCommand = new DelegateCommand(() => 
            {
                TestCommand = new DelegateCommand(() => { MessageBox.Show("Replacement is used"); });
            });
        }
    }

当调用changecommand时,test命令的委托- testcommand被替换为一个新命令。

和。

调用已更改的属性。

它告诉UI去获取这个新命令。

如果然后删除从TestCommand中更改的引发属性:

代码语言:javascript
复制
        public DelegateCommand TestCommand 
        {
            get => testCommand;
            set { testCommand = value;  }
        }

单击“更改”按钮,然后单击“我的测试”按钮,我将得到原始命令“运行”。这就是你所看到的问题。因为您的命令看起来是:

代码语言:javascript
复制
public ICommand ClickCommand { get; set; }

没有引起财产的变化。

注意:

如果我的变化是:

代码语言:javascript
复制
            ChangeCommand = new DelegateCommand(() => 
            {
                TestCommand = null;
            });

然后单击“更改”按钮,单击“测试”按钮,就不会发生任何事情。它的命令现在为null。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62583631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档