2011-06-28 23 views
13

Özel onaylayıcıları olan bir çift metin kutusu var:
("Yanlış" veri nesnelere geri gönderilip gönderilmediğini bilmiyorum (özellik dizedir), yalnızca işlevselliğini engellemeye ihtiyacım var. bağlama söyle doğrulama bu tür için doğru yer değil yani eğer bir hata, varsa bir düğme.Onar düğmesi etkinleştirme hatası

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

nasıl belirli devre dışı bırakabilir sadece ben kullanabilirsiniz Validation.ErrorTemplate desteği) gibi doğrulama hatasından herhangi biri kaldırılmışsa?

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

Olası yinelenen burada: http://stackoverflow.com/questions/231052/using-wpf-validation-rules-and-disabling-a-save -button – Damascus

+1

oradaki mesajlar soruya cevap vermiyor ... – anderi

cevap

34

bu linl de bakabilirsiniz. "TxtName" adında bir TextBox olduğunu varsayalım. TextBox'un doğrulama hatası üzerindeki "btnSave" düğmesini devre dışı bırakmak zorundayız. İşte

yapabileceğiniz budur: Bu size yardımcı olacaktır

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

Umut.

+7

Başka birinin bunu benim gibi yapmadığını bilmesi durumunda, "Validation.HasError" yolunun etrafındaki parantezlere sahip olmanız gerekir. [Ekli mülkiyete bu şekilde başvurur.] (Http://stackoverflow.com/a/14382796/1229237) Onlar olmadan bir "System.Windows.Data Uyarı: 40: BindingExpression yol hatası" vardı. –

+0

@ S.Mishra İki metin kutum varsa ne olur? Düzenle: NVM. Sadece hemen hemen aynı özgeçmiş koşullarını ekleyin. –

+0

@p__d bölümünün altına ekleyebileceğinize inanıyorum. Her giriş kontrolü için her biri. –

3

CanExecute MVVM'de yetki yönetimi içindir, ancak insanlar bunu doğrulama için kullanır. En iyi yol XAML'de yapmaktır. Doğrulamak için birden fazla alanınız varsa dönüştürücüye ihtiyacınız olacaktır (InverseAndBooleansToBooleanConverter, birden çok Boole değeri için benim uygulamamdır).

XAML kodu (Ben denedim bile görünür olabilir çünkü XAML kodu ortaya çıkarsa üzgünüm): Burada Bunun nasıl olduğunu

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

dönüştürücü

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

sizin TextBlock Bu ekleyin:

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; 

    } 
} 
İlgili konular