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öglichenZeichen 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
eingebenCharakter 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?
Sie können es in einem sonst zu Ihrer 'if (" ValidateInputText "== columnName)' -Klausel auf True setzen –
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