2011-06-28 47 views
13

我有幾個文本框與自定義驗證程序:
(我不介意如果「錯誤」的數據發送回對象(屬性是字符串),我只需要防止功能如果有錯誤,所以如果綁定是不是那種驗證請告訴正確的位置的按鈕。我就像Validation.ErrorTemplate支持,我可以使用)禁用按鈕驗證錯誤

<ControlTemplate x:Key="validator" > 
    <DockPanel LastChildFill="True"> 
     <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="12pt">!</TextBlock> 
     <Border BorderBrush="Red" BorderThickness="1.0"> 
      <AdornedElementPlaceholder /> 
     </Border> 
    </DockPanel> 
</ControlTemplate> 

<TextBox Height="23" Width="150" TextWrapping="Wrap" 
     Validation.ErrorTemplate="{StaticResource validator}"> 
     <TextBox.Text> 
      <Binding Path="StringProperty" UpdateSourceTrigger="LostFocus"> 
       <Binding.ValidationRules> 
        <local:NumbersOnly/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
</TextBox> 

我怎樣才能禁用特定如果出現任何驗證錯誤,按鈕?

<Button Content="DO Work" Height="57" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="234" Click="button1_Click" /> 
+0

這裏可能重複:http://stackoverflow.com/questions/231052/using-wpf-validation-rules-and-disabling-a-save - 按鈕 – Damascus

+1

在那裏的帖子不回答問題... – anderi

回答

34

您可以在ButtonStyle.Triggers使用MultiDataTrigger屬性。假設我們有一個名爲「txtName」的TextBox。我們必須禁用驗證錯誤TextBox上的按鈕「btnSave」。

這裏是你可以做什麼:

<Button Content="Save" 
     Grid.Column="1" 
     Grid.Row="3" 
     HorizontalAlignment="Right" 
     Height="23" 
     Name="btnSave" 
     Width="75" 
     IsDefault="True" 
     Command="{Binding SaveProtocolCommand}" 
     Margin="3"> 
    <Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="IsEnabled" Value="False"/> 
     <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding Path=(Validation.HasError), ElementName=txtName}" Value="False"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="IsEnabled" Value="True"/> 
     </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 

希望這會幫助你。

+7

如果其他人不知道我沒有這樣做,那麼你必須在'Validation.HasError'路徑上有括號。 [這就是它的附加屬性。](http://stackoverflow.com/a/14382796/1229237)沒有它們,你會得到一個'System.Windows.Data警告:40:BindingExpression路徑錯誤'就像我一樣了。 –

+0

@ S.Mishra如果我有兩個文本框? 編輯:NVM。只需添加幾乎相同的行條件綁定。 –

+0

@p__d我相信你可以在部分添加更多。每個輸入控件都有。 –

3

CanExecute在MVVM中是用於授權管理的,但人們使用它進行驗證。最好的方法是在XAML中完成。如果您有多個字段進行驗證,您將需要一個轉換器(InverseAndBooleansToBooleanConverter是我的多個布爾值的實現)。這裏是如何做到這一點:

XAML代碼(對不起,如果在XAML代碼確實顯示,因爲我可以讓它出現,即使我嘗試過):

<Button Name="Button_Test" Content="Test"> 
    <Button.IsEnabled> 
     <MultiBinding Converter="{StaticResource InverseAndBooleansToBooleanConverter}" Mode="TwoWay"> 
      <Binding ElementName="TextBox_Field1" Path="(Validation.HasError)" /> 
      <Binding ElementName="TextBox_Field2" Path="(Validation.HasError)" /> 
      <Binding ElementName="TextBox_Field3" Path="(Validation.HasError)" /> 
     </MultiBinding> 
    </Button.IsEnabled> 
</Button> 

轉換器

public class InverseAndBooleansToBooleanConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values.LongLength > 0) 
     { 
      foreach (var value in values) 
      { 
       if (value is bool && (bool)value) 
       { 
        return false; 
       } 
      } 
     }  
     return true; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
      throw new NotImplementedException(); 
    } 
} 
1

添加到您的TextBlock:

Validation.Error="Save_Error" 

代碼隱藏(xaml.cs):

public partial class MyView : Window 
{ 
    private int _noOfErrorsOnScreen = 0; 

    public MyView() 
    { 
     InitializeComponent(); 
    } 


    private void Save_Error(object sender, ValidationErrorEventArgs e) 
    { 
     if (e.Action == ValidationErrorEventAction.Added) 
      _noOfErrorsOnScreen++; 
     else 
      _noOfErrorsOnScreen--; 

     Save.IsEnabled = _noOfErrorsOnScreen > 0 ? false : true; 

    } 
}