簡體   English   中英

如何使用清除按鈕清除 WPF MVVM 中的文本框

[英]How to clear textbox in WPF MVVM with clear button

好的,所以我想通過單擊按鈕清除文本框中的文本。 兩者都放置在 XAML 代碼中的第一個堆棧面板中。 我試圖讓它與命令和綁定一起工作,但我似乎無法讓它工作..有什么建議嗎? SqlQueryCommand 綁定到清除按鈕,SqlQueryString 綁定到文本框。

模型:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using WpfMVVM.Commands;

namespace PoC.ViewModels
{
    class MainWindowViewModel
{
    public RelayCommand ClearSqlQueryCommand { get; private set; }
    public RelayCommand ClearFilterCommand { get; private set; }
    public RelayCommand ClearFilterByIdCommand { get; private set; }

    public event PropertyChangedEventHandler PropertyChanged;
    private string sqlQueryString;
    private string filterString;
    private string filterByIdString;
    public string SqlQueryString
    {
        get
        {
            return sqlQueryString;
        }
        set
        {
            sqlQueryString = value;
            OnPropertyChanged(nameof(SqlQueryString));
        }
    }

    public string FilterString
    {
        get
        {
            return filterString;
        }
        set
        {
            filterString = value;
            OnPropertyChanged(nameof(FilterString));
        }
    }

    public string FilterByIdString
    {
        get
        {
            return filterByIdString;
        }
        set
        {
            filterByIdString = value;
            OnPropertyChanged(nameof(FilterByIdString));
        }
    }

    public MainWindowViewModel()
    {
        ClearSqlQueryCommand = new RelayCommand(ClearSqlQuery, CanClearSqlQuery);
        ClearFilterCommand = new RelayCommand(ClearFilter, CanClearFilter);
        ClearFilterByIdCommand = new RelayCommand(ClearFilterById, CanClearFilterById);
    }

    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    public void ClearSqlQuery(object parameter)
    {
        SqlQueryString = string.Empty;
    }

    public bool CanClearSqlQuery(object parameter)
    {
        return true;
    }

    public void ClearFilter(object parameter)
    {

    }

    public bool CanClearFilter(object parameter)
    {
        return true;
    }

    public void ClearFilterById(object parameter)
    {

    }

    public bool CanClearFilterById(object parameter)
    {
        return true;
    }
}
}

中繼命令:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;

namespace WpfMVVM.Commands
{
 public class RelayCommand : ICommand
   {
    Action<object> _execute;
    Func<object, bool> _canExecute;


    public RelayCommand(Action<object> execute, Func<object, bool> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        if (_canExecute != null)
        {
            return _canExecute(parameter);
        }
        else
        {
            return false;
        }
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
        }
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}
}

XAML:

<Window x:Class="PoC.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:PoC"
    xmlns:viewModels="clr-namespace:PoC.ViewModels"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <viewModels:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="3*"/>
    </Grid.ColumnDefinitions>
    <TreeView>
    </TreeView>
    
    <Grid Grid.Column="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="2*" />
            <RowDefinition Height="1*"/>
            <RowDefinition Height="5*"/>
        </Grid.RowDefinitions>
        <Border Grid.Row="0" BorderThickness="0 0 0 1" BorderBrush="Black"/>
        <StackPanel Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
            <TextBox Text="{Binding SqlQueryString, UpdateSourceTrigger=PropertyChanged}" Height="30" Width="450" TextAlignment="Center"/>
            <Button Content="Execute" Margin="10 0" Padding="5 0"/>
            <Button Content="Clear" Padding="5 0" Command="{Binding ClearSqlQueryCommand}"/>
        </StackPanel>
        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
            <TextBox Text="{Binding FilterString}" Grid.Row="0" Height="30" Width="200"/>
            <Button Content="Filter" Margin="10 0" Padding="5 0"/>
            <Button Content="Clear" Padding="5 0" Margin="0 0 115 0"/>
            <TextBox Text="{Binding FilterByIdString}" Grid.Row="0" Height="30" Width="100"/>
            <Button Content="Filter" Margin="10 0 0 0" Padding="5 0"/>
        </StackPanel>
        <DataGrid Grid.Row="2" VerticalScrollBarVisibility="Visible" BorderThickness="0 1 1 1"/>
    </Grid>
    
    
</Grid>

您似乎缺少: MainWindowViewModel類上的: INotifyPropertyChanged

您可以通過將其值設置為“”輕松地做到這一點。

texbox.Text="";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM