2013-05-29 97 views
0

我試圖禁用TextBox上的ValidatesOnDataErrors,如果某個複選框被選中。 我曾嘗試在文本框上放置一個觸發器來啓用或禁用基於複選框的驗證,好像觸發器被擊中但不禁用驗證。我正在使用IDataErrorInfo驗證.cs代碼。這裏是我嘗試過的代碼,這是一個令人頭疼的問題,所以希望你能提供幫助。如果CheckBox被選中,禁用ValidatesOnDataErrors WPF

的.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> 

回答

2

而是改變在運行時ValidatesOnDataErrors財產的,最好的辦法是在視圖模型的布爾屬性並做驗證,只有當它是真實的。布爾屬性可以綁定到複選框的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> 
+0

感謝很多的快速回復。我有5個文本框,每個文本框都有相應的複選框。我討厭有5個布爾屬性檢查每個文本框?有沒有辦法避免這種情況? 5個文本框是必需的,除非您點擊一個複選框,指出「無法讀取」,即當我想禁用驗證並從文本框邊框(由ValidatesOnDataError引起)中移除紅色時。 –

0

使用此,

Validation.ErrorTemplate="{x:Null}" 
相關問題