Prasanna Rajagopalan
Prasanna Rajagopalan

Reputation: 11

Disable validation for a button in IDataErrorInfo

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}" />

Upvotes: 0

Views: 1133

Answers (1)

Ayyappan Subramanian
Ayyappan Subramanian

Reputation: 5366

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;
        }
    }
}

Upvotes: 1

Related Questions