2011-01-01 21 views
5

हाय मुझे अपने एप्लिकेशन में कुछ टेक्स्टबॉक्स सत्यापित करने की आवश्यकता है। मुझे सत्यापन नियम "DataErrorValidationRule" का उपयोग करने का समर्थन किया गया। यही कारण है कि मेरी कक्षा में मैंने IDataErrorInfo इंटरफेस को कार्यान्वित किया और aproperiate कार्यों को लिखा। मेरी XAML कोड में मैं बक्सें को बाइंडिंग और सत्यापन नियमों जोड़ाwpf - सत्यापन - टूलटिप्स कैसे दिखाएं और "रन" बटन अक्षम करें

इस टेक्स्ट बॉक्स की
<TextBox x:Name="txtName" Grid.Column="3" Grid.Row="1" TextAlignment="Center" > 
         <TextBox.Text> 
          <Binding Path="Name" > 
           <Binding.ValidationRules> 
            <DataErrorValidationRule></DataErrorValidationRule> 
           </Binding.ValidationRules> 
          </Binding> 
         </TextBox.Text> 
        </TextBox> 

मान्यता ठीक है - मैं लाल फ्रेम पाठ बॉक्स पर दिखाई देता है, तो डेटा गलत है मतलब है। हालांकि मुझे उस टेक्स्टबॉक्स पर टूलटिप दिखाने की ज़रूरत है, लेकिन यदि कोई टेक्स्टबॉक्स में गलत डेटा है तो मुझे "रन" बटन को अक्षम करना होगा। तह करने का सबसे अच्छा तरीका क्या है ??

EDIT पहली समस्या हल हो गई थी, लेकिन मेरे पास एक और है। मुझे अपने बटन को प्रमाणित करने के लिए मल्टीबिंडिंग का उपयोग करने की आवश्यकता है। कि

<Button x:Name="btnArrange" Grid.Column="0" Content="Rozmieść" Click="btnArrange_Click" > 
       <Button.Style> 
        <Style TargetType="Button"> 
         <Style.Triggers> 
          <DataTrigger Value="False"> 
           <DataTrigger.Binding> 
            <MultiBinding Converter="{StaticResource BindingConverter}"> 
             <Binding ElementName="txtName" Path="Validation.HasError" /> 
             <Binding ElementName="txtSurname" Path="Validation.HasError"/> 
             <Binding ElementName="txtAddress" Path="Validation.HasError"/> 

            </MultiBinding> 
           </DataTrigger.Binding> 
           <Setter Property="IsEnabled" Value="False"/> 

          </DataTrigger> 
         </Style.Triggers> 
        </Style>   
       </Button.Style> 

     </Button> 

मेरे कनवर्टर की तरह तो मैंने किया था sth की तरह है कि

public class Converters : IMultiValueConverter 
{ 

    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if(values !=null && values.Length > 0) 
     { 


      if (values.Cast<type>().Count(val => val) > 0) 
       return false; 
      return true; 
     } 
     return false; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 

    #endregion 
} 

हालांकि मैं इस कनवर्टर में InvalidCastException मिलता लग रहा है। उस मामले में उचित कास्ट क्या है? मुझे लगता है जैसे हैसरर एक बूल प्रकार है इसलिए मुझे बूल डालना चाहिए।

+0

इसका मतलब "प्रकार" क्या है? इसे "अगर (मान। कैस्ट () के साथ बदलें। कोई भी (वैल => वैल))" – vorrtex

उत्तर

2

यदि आप एक सत्यापन सारांश बनाते हैं तो आप HasErrors संपत्ति पर अपने "रन" बटन की IsEnabled संपत्ति को बाध्य कर सकते हैं।

के रूप में आप चाहते हैं IsEnabledtrue जब HasErrors गलत है (और इसके विपरीत) आप एक मध्यवर्ती संपत्ति या कनवर्टर का उपयोग करने की आवश्यकता होगी।

+1

मैं सत्यापन सारांश कैसे बना सकता हूं ?? – stylus

+0

@ validator - यहां एक है - http://codeblitz.wordpress.com/2009/05/12/wpf- validation-summary-control/ - मुझे सिल्वरलाइट के साथ भ्रमित हो रहा था, क्षमा करें। – ChrisF

6
<Window.Resources> 
    <Style x:Key="ElementInError" TargetType="{x:Type FrameworkElement}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="True"> 
       <Setter Property="ToolTip" 
        Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<!-- ... --> 
<TextBox x:Name="txtName" Style="{StaticResource ElementInError}"> 
    <!-- ... -->   
</TextBox> 
<!-- ... --> 
     <Button x:Name="OkButton" Content="Ok" Margin="5" Click="OkButton_Click"> 
      <Button.Style> 
       <Style TargetType="Button"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=txtName,Path=(Validation.HasError)}" Value="True"> 
          <Setter Property="IsEnabled" Value="False" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 
+0

उत्तर के लिए धन्यवाद, क्या आप मेरे प्रश्न पर दोबारा गौर कर सकते हैं - मैंने इसे – stylus

17

एक उपकरण डाल टिप में त्रुटि संदेश दिखाने के लिए अपने Application.Resources में इस:

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="true"> 
     <Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors)[0].ErrorContent}"/> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

(http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx से उदाहरण)

सक्षम/एक बटन आप कुछ इस्तेमाल कर सकते हैं अक्षम करने के लिए

<Button x:Name="btnOK" Content="OK" IsDefault="True" Click="btnOK_Click"> 
    <Button.Style> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="IsEnabled" Value="false" /> 
     <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding ElementName=txt1, Path=(Validation.HasError)}" Value="false" /> 
      <Condition Binding="{Binding ElementName=txt2, Path=(Validation.HasError)}" Value="false" /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="IsEnabled" Value="true" /> 
     </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 

या आप आईसीओएमएंड को कार्यान्वित कर सकते हैं और कॉम का उपयोग कर सकते हैं और बाध्यकारी।

संपादित

यहाँ एक पूरी तरह से काम कर रहे उदाहरण है। यह दो टेक्स्टबॉक्स के साथ एक खिड़की प्रदर्शित करता है। बटन सक्षम है अगर केवल और यदि टेक्स्टबॉक्स दोनों खाली नहीं हैं। एक परियोजना ValidationDemo बुलाया बनाएँ और उस में निम्न फ़ाइलें डाल:

MainWindow.xaml:

<Window x:Class="ValidationDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="146" Width="223"> 
    <Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </Window.Resources> 
    <Grid> 
    <Label Content="A" Height="28" HorizontalAlignment="Left" Margin="46,7,0,0" Name="label1" VerticalAlignment="Top" /> 
    <TextBox Name="txtA" Text="{Binding Path=TextA, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Height="23" HorizontalAlignment="Left" Margin="69,12,0,0" VerticalAlignment="Top" Width="120" /> 
    <Label Content="B" Height="28" HorizontalAlignment="Left" Margin="46,39,0,0" Name="label2" VerticalAlignment="Top" /> 
    <TextBox Name="txtB" Text="{Binding Path=TextB, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Height="23" HorizontalAlignment="Left" Margin="69,41,0,0" VerticalAlignment="Top" Width="120" /> 
    <Button Name="btnOk" Content="OK" Height="23" HorizontalAlignment="Left" Margin="114,70,0,0" VerticalAlignment="Top" Width="75" Click="btnOk_Click"> 
     <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="IsEnabled" Value="false" /> 
      <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding ElementName=txtA, Path=(Validation.HasError)}" Value="false" /> 
       <Condition Binding="{Binding ElementName=txtB, Path=(Validation.HasError)}" Value="false" /> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="IsEnabled" Value="true" /> 
      </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
     </Button.Style> 
    </Button> 
    </Grid> 
</Window> 

MainWindow.xaml.cs:

using System.Windows; 

namespace ValidationDemo 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 

    private Model model = new Model(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this.model; 
    } 

    private void btnOk_Click(object sender, RoutedEventArgs e) 
    { 
     Application.Current.Shutdown(); 
    } 
    } 
} 

मॉडल।सीएस:

using System; 
using System.ComponentModel; 

namespace ValidationDemo 
{ 
    public class Model : INotifyPropertyChanged, IDataErrorInfo 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string textA = string.Empty; 
    public string TextA 
    { 
     get 
     { 
     return this.textA; 
     } 
     set 
     { 
     if (this.textA != value) 
     { 
      this.textA = value; 
      this.OnPropertyChanged("TextA"); 
     } 
     } 
    } 

    private string textB = string.Empty; 
    public string TextB 
    { 
     get 
     { 
     return this.textB; 
     } 
     set 
     { 
     if (this.textB != value) 
     { 
      this.textB = value; 
      this.OnPropertyChanged("TextB"); 
     } 
     } 
    } 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
     string result = string.Empty; 
     switch (columnName) 
     { 
      case "TextA": 
      if (string.IsNullOrEmpty(this.textA)) 
      { 
       result = "'A' must not be empty"; 
      } 
      break; 
      case "TextB": 
      if (string.IsNullOrEmpty(this.textA)) 
      { 
       result = "'B' must not be empty"; 
      } 
      break; 
     } 
     return result; 
     } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    } 

} 
+0

संपादित किया दुर्भाग्य से यह काम नहीं कर रहा है। इस तथ्य के बावजूद कि मेरे टेक्स्टबॉक्स की वैधता में से एक विफल हो गया है मेरा ओके बटन अभी भी सक्षम है – stylus

+0

@ वैलिडेटर: मैंने एक कामकाजी उदाहरण जोड़ा। – TomBot

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