使用 RelayCommand 从 ViewModel 中清除条目文本

Posted

技术标签:

【中文标题】使用 RelayCommand 从 ViewModel 中清除条目文本【英文标题】:Clear entry text from ViewModel using RelayCommand 【发布时间】:2022-01-01 22:38:07 【问题描述】:

我想从绑定在那里的 ViewModel 中清除条目文本。在下面的代码中,我尝试使用 RelayCommand,但它不起作用。

我想要完成的事情:单击名为AddQuestionToQuiz 的按钮时,通过在按钮上使用命令来执行一个函数。我的 ViewModel 中的函数OnCreateQuizClick() 被触发,这个函数需要清除我的输入文本,我暂时没有。

我也尝试使用常规命令而不是使用 RelayCommand,但在这里它也不想工作。

编辑:底层代码工作正常 - 已更新 代码用于在单击 ViewModel 中的按钮时清除条目文本,实现 INotifyPropertyChanged 接口

.xaml - 代码

<Button x:Name="AddQuestionToQuiz" WidthRequest="200" Command="Binding CreateQuizCommand" Style="StaticResource ButtonStyle" Text="Add question to quiz"></Button>

ViewModel - 代码

internal class CreateQuizPageViewModel : INotifyPropertyChanged

    // Quiz Name Input
    public String QuizNameInput  get; set; 

    private String quizQuestionInput = "";
    public String QuizQuestionInput 
    
        get  return quizQuestionInput;    
        set  quizQuestionInput = value; OnPropertyChanged(); 
     

    public RelayCommand CreateQuizCommand  get; set; 

    public CreateQuizPageViewModel()
    
        CreateQuizCommand = new RelayCommand(OnCreateQuizClick);
    

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName = null)
    
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    

    public void OnCreateQuizClick()
    
        QuizQuestionInput = "";
    

【问题讨论】:

您的 VM 未实现 INotifityPropertyChaged,因此 UI 不会收到有关 VM 更改的通知 我通过一个工作示例编辑了上面的代码(ViewModel 已更新),谢谢@Jason。也可以通过使用普通命令而不是中继命令来工作 不要将工作代码添加到问题中,而是将其添加为下面的“您的答案”。这使任何看到此问题的人都更容易意识到它已被回答。谢谢。 【参考方案1】:

编辑:视图模型已更新

.xaml - 代码

<Button x:Name="AddQuestionToQuiz" WidthRequest="200" Command="Binding CreateQuizCommand" Style="StaticResource ButtonStyle" Text="Add question to quiz"></Button>

ViewModel - 代码

internal class CreateQuizPageViewModel : INotifyPropertyChanged

    // Quiz Name Input
    public String QuizNameInput  get; set; 

    private String quizQuestionInput = "";
    public String QuizQuestionInput 
    
        get  return quizQuestionInput;    
        set  quizQuestionInput = value; OnPropertyChanged(); 
     

    public RelayCommand CreateQuizCommand  get; set; 

    public CreateQuizPageViewModel()
    
        CreateQuizCommand = new RelayCommand(OnCreateQuizClick);
    

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName = null)
    
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    

    public void OnCreateQuizClick()
    
        QuizQuestionInput = "";
    

【讨论】:

以上是关于使用 RelayCommand 从 ViewModel 中清除条目文本的主要内容,如果未能解决你的问题,请参考以下文章

WPF MvvmLight RelayCommand 绑定Command 的使用

如何将 RelayCommand 与 MVVM Light 框架一起使用

使用 ViewModel 中定义的 RelayCommand 传递参数(来自 Josh Smith 示例)

WPF Multibinding - 需要使用 Relaycommand

MVVM RelayCommand可以执行

如何传递多个参数 RelayCommand? [复制]