0

如果选中某个复选框,我正在尝试禁用 TextBox 上的 ValidatesOnDataErrors。我尝试在文本框上放置一个触发器以启用或禁用基于复选框的验证,似乎触发器被击中但不禁用验证。我在.cs代码中使用IDataErrorInfo进行验证。这是我尝试过的代码,这一直很头疼,所以希望你能提供帮助。

.xaml

<TextBox Name="txtFoundERTReading" Height="23" Canvas.Left="125" TextWrapping="Wrap" Canvas.Top="136" Width="120">
    <TextBox.Style>                                
        <Style TargetType="{x:Type TextBox}">                                    
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=cbFoundERTReading, Path=IsChecked}" Value="False">
                    <Setter Property="Text" Value="{Binding Found.ERTReading, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=cbFoundERTReading, Path=IsChecked}" Value="True">
                    <Setter Property="TextBox.IsEnabled" Value="False" />
                    <Setter Property="Text" Value="{Binding Found.ERTReading, Mode=TwoWay, ValidatesOnDataErrors=False, UpdateSourceTrigger=PropertyChanged}" />                                            
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
4

2 回答 2

2

最好的方法不是在运行时更改 ValidatesOnDataErrors 属性,而是在 viewmodel 中有一个布尔属性,并且仅在它为 true 时才进行验证。布尔属性可以绑定到 Checkbox 的 IsChecked 属性。

    public string Name
    {
        get { return name; }
        set { name = value; RaisePropertyChanged("Name"); }
    }

    public string this[string columnName]
    {
        get
        {
            if (CanValidate)
            {
                if (columnName == "Name")
                {
                    if (!ValidateName())
                    {
                        return "Error";
                    }
                }
            }

            return "";
        }
    }

    private bool canValidate;

    public bool CanValidate
    {
        get { return canValidate; }
        set { canValidate = value; RaisePropertyChanged("CanValidate"); RaisePropertyChanged("Name");}
    }

    private bool ValidateName()
    {
        if (String.IsNullOrEmpty(Name))
        {
            return false;
        }
        return true;
    }

XAML 如下所示,

    <StackPanel>
        <TextBox Margin="5" Text="{Binding Name, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}"/>
        <CheckBox Margin="5" Content="Can validate" IsChecked="{Binding CanValidate, Mode=TwoWay}"/>
    </StackPanel>
于 2013-05-29T14:20:10.710 回答
0

Use this,

Validation.ErrorTemplate="{x:Null}"
于 2014-09-12T06:28:22.873 回答