如何在 WPF 中的删除操作之前启用文本框并等待输入条件

Posted

技术标签:

【中文标题】如何在 WPF 中的删除操作之前启用文本框并等待输入条件【英文标题】:How to enable a textbox and wait for criteria to be entered before delete operation in WPF 【发布时间】:2021-04-06 08:09:08 【问题描述】:

我无法从我的节目中删除记录。我有一个文本框,默认情况下它被绑定到我的 ViewModel 的布尔属性的 ReadOnly 属性禁用。文本框允许用户输入 ID 作为要删除的记录的标准。我的视图模型中有删除代码,该代码假设在第一次单击删除按钮时启用文本框,并等待用户在文本框中输入 ID,然后第二次单击删除按钮执行删除手术。但相反,代码没有按预期工作,代码启用文本框并在单击删除按钮时在用户不输入 ID 的情况下运行删除操作。问题总结是,当用户点击删除按钮时,整个删除代码块都会运行,甚至不允许用户输入要删除的记录的ID。请问如何使代码启用ID文本框并等待用户输入ID并第二次单击删除按钮以进行删除操作? 这是代码:

        private RelayCommand deleteCommand;

    public RelayCommand DeleteCommand
    
        get  return deleteCommand; 
    

    public void Delete()
    
        MessageBoxResult result = MessageBox.Show("Are you sure you want to delete this record?", "Delete Operation", MessageBoxButton.YesNo, MessageBoxImage.Question,MessageBoxResult.No);
        if(result == MessageBoxResult.No)
        
            return;
        
        else
        
            try
            
                IDEnabled = false;

                var IsDeleted = ObjStudentService.Delete(NewStudent.Id);
                if (!IsDeleted)
                
                    MessageBox.Show("Student Record Deleted", "Delete Operation", MessageBoxButton.OK, MessageBoxImage.Information);
                    LoadData();
                    NewStudent.Id = 0;
                
                else
                
                    MessageBox.Show("Unable to Delete Record, ensure you enter the correct ID.", "Delete Operation", MessageBoxButton.OK, MessageBoxImage.Information);

                
            
            catch (Exception ex)
            

                MessageBox.Show(ex.Message, "Exception Found", MessageBoxButton.OK, MessageBoxImage.Error);
            

        

    

“IDEnabled”是禁用 ID 文本框字段的 ReadOnly 属性的属性,以便用户可以输入要删除的特定记录的 ID。

我在构造函数中调用代码如下:

        public StudentViewModel()
    
        ObjStudentService = new StudentService();
        LoadData();
        NewStudent = new Student();
     deleteCommand = new RelayCommand(Delete);

这是我在 XAML 中对删除按钮的绑定:

                        <Button x:Name="BtnDelete" Margin="10 0 0 0" IsTabStop="False"
                            IsEnabled="Binding Path=ButtonEnabled"
                        Style="StaticResource MaterialDesignRaisedAccentButton"
                        ToolTip="Delete record"
                            Command="Binding Path=DeleteCommand"
                        Width="75">
                        Delete
                    </Button>

请有人帮我看看我的代码,看看我哪里出错了。

【问题讨论】:

【参考方案1】:

当用户单击删除按钮时,您可以检测文本框何时启用或未启用。如果文本框被禁用,启用它以便用户可以输入 ID。如果文本框已启用,请验证输入,禁用文本框,然后开始删除操作。

public void Delete()

    if (!IDEnabled) //assuming that if true, the textbox is no longer ReadOnly 
     
        IDEnabled = true; //enable the textbox
     
    else 
    
        //validate the ID
        IDEnabled = false; //disable the textbox
        //delete the record
        var IsDeleted = ObjStudentService.Delete(NewStudent.Id);
    


【讨论】:

我仍在努力理解您的代码。 第一次单击按钮时,文本框被禁用 (IDEnabled = false),因此您启用它以允许用户键入。第二次单击按钮时,文本框已启用,因此您验证文本框的输入,删除记录并禁用文本框。通过禁用文本框,一切都会被重置。 如果他在“if”块中的条件评估为真,这意味着“else”块中不会发生删除操作。 @DaPlug 是的。那将解决您的问题,即“当用户单击删除按钮时,整个删除代码块都会运行,甚至不允许用户输入要删除的记录的 ID。”。 “if”块将切换 IDEnabled 标志,以便下次按下按钮时,“else”块将评估为 true。 非常感谢,它工作得很好。

以上是关于如何在 WPF 中的删除操作之前启用文本框并等待输入条件的主要内容,如果未能解决你的问题,请参考以下文章

WPF 文本框 RaiseEvent

如何在C#/ wpf中启用datagrid列文本

WPF中的禁用按钮?

如何在WPF中进行模态对话?

根据WPF中的TextBox Text属性启用/禁用按钮?

iTunes中的报亭启用问题[关闭]