在WPF / MVVM中按下按钮时验证TextBox

时间:2016-02-15 16:52:27

标签: c# wpf

我的视图中有TextBoxButton。我的视图模型中有ICommand方法,String序列号属性和IsEnabled属性。

当用户点击Button时,我想要使用TextBox属性验证InDatabase中的序列号。如果TextBox中的内容无效,我想在TextBox上引发错误。如果内容在TextBox中有效,我想禁用Button并执行命令。

以下是观点:

<StackPanel Width="Auto" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Center">
    <UniformGrid Rows="3"  >
        <TextBlock Text="This device appears to be uninitialized."/>
        <UniformGrid Rows="1" Columns="2">
            <Label>Serial Number:</Label>
            <TextBox Text="{Binding IdentifiedSerialNumber, Mode=TwoWay, ValidatesOnDataErrors=True}"></TextBox>
        </UniformGrid>
        <Button Content="Identify" Command="{Binding IdentifyCommand}" IsEnabled="{Binding CanExecuteDeviceRestoration}"/>
    </UniformGrid>
</StackPanel>

以下是视图模型:

public string IdentifiedSerialNumber 
{
    get
    {
        return this.identifiedSerialNumber;
    }
    set
    {
        this.identifiedSerialNumber = value;
    }
}

public ICommand IdentifyCommand
{
    get
    {
        return new RelayCommand(this.RelayRestoreControllerIdentity);
    }
}

public bool CanExecuteDeviceRestoration
{
    get
    {
        return canExecuteDeviceRestoration;
    }
    private set
    {
        this.canExecuteDeviceRestoration = value;
        RaisePropertyChanged("CanExecuteDeviceRestoration");
    }
}

public async void RelayRestoreControllerIdentity()
{
    await Task.Run(
    () =>
    {
        this.RestoreControllerIdentity();
    });
}

public bool InDatebase
{
    get
    {
        return DatabaseConnection.DeviceExists(this.IdentifiedSerialNumber);
    }
}

我的问题是如何绑定行为,以便当用户单击Button TextBox被验证时,如果失败则会显示错误消息,如果它通过{ {1}}将被禁用,命令将执行。

1 个答案:

答案 0 :(得分:0)

您需要实现IDataErrorInfo 这将添加一个返回字符串的索引器 如果返回空字符串,则表示没有错误 你可以返回一个空字符串,直到按下按钮(你可以使用一个标志)。
当按下按钮时,运行验证逻辑并适当更改标志并为IdentifiedSerialNumber增加PropertyChanged事件
您可以从here学习如何实现IDataErrorInfo 您还需要为IdentifiedSerialNumber提升PropertyChanged事件。