2016-03-30 5 views
0

Ich habe eine App in MVVM-Muster; Es enthält ein Textfeld und eine Schaltfläche.WPF MVVM IDataErrorInfo

Ich füge eine Bestätigung hinzu, dass, wenn Textbox leer ist, Textboxfarbe zu Rot wechselt;

und an dieser Stelle möchte ich, dass die Taste, bis das

Benutzer falsch ermöglichen

Zeichen in Textfeld eingeben und dann Wechsel auf true Taste aktivieren;

mein XAML-Code ist:

<Window.Resources> 
    <ControlTemplate x:Key="ErrorTemplate"> 
     <DockPanel LastChildFill="True"> 
      <Border BorderBrush="Pink" BorderThickness="1"> 
       <AdornedElementPlaceholder /> 
      </Border> 
     </DockPanel> 
    </ControlTemplate> 
    <Style TargetType="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> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <TextBox Margin="10" Text="{Binding ValidateInputText,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" 
Validation.ErrorTemplate="{StaticResource ErrorTemplate}"> 
    </TextBox> 
    <Button Margin="10" Grid.Row="2" Command="{Binding ValidateInputCommand}"/> 

und meine Befehlsklasse ist:

public class RelayCommand : ICommand 
{ 
    private Action WhatToExcute; 
    private Func<bool> WhenToExecute; 
    public RelayCommand(Action what,Func<bool>when) 
    { 
     WhatToExcute = what; 
     WhenToExecute = when; 
    } 

    public event EventHandler CanExecuteChanged; 

    public bool CanExecute(object parameter) 
    { 
     return WhenToExecute(); 
    } 

    public void Execute(object parameter) 
    { 
     WhatToExcute(); 
    } 
} 

und mein Viewmodel ist:

public class ViewModel : IDataErrorInfo , INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    Product product = new Product(); 

    public ViewModel() 
    { 
     ValidateInputCommand = new RelayCommand(action, valid); 
    } 
    public void action() 
    { 

    } 
    public bool valid() 
    { 
     if (product.Name == null) 
      return false; 

     return true; 
    } 

    public string ValidateInputText 
    { 
     get { return product.Name; } 
     set { 
      product.Name = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(ValidateInputText)); 
      } 
     } 
    } 

    public RelayCommand ValidateInputCommand { get; set; } 

    public string this[string columnName] 
    { 
     get 
     { 
      if ("ValidateInputText" == columnName) 
      { 

       if (String.IsNullOrEmpty(ValidateInputText)) 
       { 
        return "Please enter a Name"; 
       } 
      } 
      return ""; 
     } 
    } 

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

jetzt, wenn ich meine app laufen, die Farbe der Textbox ist rot und wenn ich eine

eingeben

Charakter es normal ändern, das ist in Ordnung, aber die

Taste falsch aktivieren und ändert sich nicht

so klicken ich konnte nicht drücken.

was soll ich tun?

+0

Sie können es in einem sonst zu Ihrer 'if (" ValidateInputText "== columnName)' -Klausel auf True setzen –

+0

Wo möglich, sollten Sie 'INotifyDataErrorInfo' für Ihre Ansicht Modelle bevorzugen. Es ist viel einfacher zu implementieren und verhält sich konsistenter mit WPF. – Gusdor

Antwort

0

Das CanExecuteChanged-Ereignis auf Ihrem RelayCommand wird nie ausgelöst. Daher wird die Schaltfläche, an die der Befehl gebunden wurde, seinen IsEnabled-Status nie neu bewerten. Ihr Ansichtsmodell könnte den Befehl auf Änderungen seines gültigen Status hinweisen, und der Befehl sollte sein CanExecuteChanged-Ereignis auslösen.