禁用IDataErrorInfo中按钮的验证

时间:2015-02-08 17:07:47

标签: wpf mvvm idataerrorinfo

我的View上有两个“搜索”和“清除”按钮,我的视图模型上有两个命令。我在我的ViewModel上实现了IDataErrorInfo并验证了输入字段。如何禁用“清除”按钮的验证?

<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 个答案:

答案 0 :(得分:0)

我认为您希望根据搜索文本框中的验证启用/禁用清除按钮。我使用MvvmLight Relaycommand使用GalaSoft.MvvmLight.CommandWpf使用命名空间从最新的MVVMLight命令;请参考下面的代码。

<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;
        }
    }
}
相关问题