2011-06-28 10 views
13

मेरे पास कस्टम सत्यापनकर्ताओं के साथ कुछ टेक्स्टबॉक्स हैं:
(मुझे कोई फर्क नहीं पड़ता कि "गलत" डेटा ऑब्जेक्ट पर वापस भेजा गया है (संपत्ति स्ट्रिंग है), मुझे बस इसकी कार्यक्षमता को रोकने की आवश्यकता है एक बटन यदि कोई त्रुटि होती है, इसलिए यदि बाध्यकारी मान्यता उस तरह कृपया बताने के लिए सही जगह नहीं है।सत्यापन त्रुटि पर बटन अक्षम करना

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

मैं विशिष्ट निष्क्रिय कर सकते हैं मैं सिर्फ Validation.ErrorTemplate समर्थन है कि मैं उपयोग कर सकते हैं) की तरह अगर सत्यापन सत्यापन में से कोई भी उठाया गया है तो बटन?

<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

आप Button की Style.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

यदि किसी और को यह नहीं पता है कि मैंने ऐसा नहीं किया है, तो आपके पास 'सत्यापन' हैसरर' पथ के चारों ओर कोष्ठक होना चाहिए। [इस तरह यह संलग्न संपत्ति को संदर्भित करता है।] (Http://stackoverflow.com/a/14382796/1229237) उनके बिना, आपको 'System.Windows.Data चेतावनी: 40: बाइंडिंग एक्स्प्रेशन पथ त्रुटि' मिल जाएगी जैसे मैं था। –

+0

@ एस मिश्रा क्या होगा यदि मेरे पास दो टेक्स्टबॉक्स हैं? संपादित करें: एनवीएम। केवल बाध्यकारी लगभग समान लाइन स्थिति जोड़ें। –

+0

@p__d मुझे विश्वास है कि आप अनुभाग के तहत अधिक जोड़ सकते हैं। प्रत्येक इनपुट नियंत्रण के लिए प्रत्येक। –

0

यदि आप एमवीवीएम का उपयोग करते हैं तो इंटरफ़ेस ICommand का एक तरीका CanExecute लागू करें। Button doesn't become disabled when command CanExecute is false

आप तो बस एक बटन IsEnabled की संपत्ति का उपयोग codebehind में अपने तर्क लिखते हैं:

XAML:

<Button Name=_btn/> 

SomeForm.xaml.cs:

_btn.IsEnabled=false; 
3

CanExecute एमवीवीएम में प्राधिकरण प्रबंधन के लिए है लेकिन लोग इसे सत्यापन के लिए उपयोग करते हैं। 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" 

codebehind (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; 

    } 
} 
संबंधित मुद्दे