0
votes

I have two buttons "Search" and "Clear" on my View for which I have two commands on my view model. I have implemented IDataErrorInfo on my ViewModel and validated the input fields. How can I disable validation for the Clear button?

<TextBox Text="{Binding SearchText, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}"
Validation.ErrorTemplate="{StaticResource ErrorTemplate}"/>
<Button Content="Search" Command="{Binding SearchCommand}" />
<Button Content="Clear" Command="{Binding ClearCommand}" />
1
Your requirement is not more clear. Do you want to disable Clear button based on text in Seach textbox. Example If the seach is not null or empty enable the clear button. Please explain - Ayyappan Subramanian

1 Answers

1
votes

I am assumed you want to enable / disable the clear button based on validation in the search textbox. I have used the MvvmLight Relaycommand for commanding from the latest MVVMLight using the namespace using GalaSoft.MvvmLight.CommandWpf; refer the code below.

<Window x:Class="DataTemplateSelector_Learning.Window3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window3" Height="300" Width="300">    
<Grid>
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Search Text"/>
            <TextBox Width="100" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,
                ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}"  />
        </StackPanel>
        <Button Content="Search" Command="{Binding SearchCommand}" />
        <Button Content="Clear" Command="{Binding ClearCommand}" />
    </StackPanel>
</Grid>

public partial class Window3 : Window
{
    public Window3()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}
class ViewModel:INotifyPropertyChanged,IDataErrorInfo
{
    private string searchText;
    private bool enableClear;

    public string SearchText
    {
        get { return searchText; }
        set { searchText = value; Notify("SearchText"); }
    }

    public ICommand SearchCommand { get; set; }
    public ICommand ClearCommand { get; set; }

    public ViewModel()
    {
        ClearCommand = new RelayCommand(OnClear, CanClear);
    }

    private bool CanClear()
    {
        return enableClear;
    }

    private void OnClear()
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Notify(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
        }               

    }

    public string Error
    {
        get { return String.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            String errorMessage = String.Empty;
            if (!string.IsNullOrEmpty(SearchText))
            {
                if (SearchText.Length > 0)
                {
                    enableClear = true;
                }
                else
                {
                    enableClear = false;
                }
            }

            return errorMessage;
        }
    }
}