2016-12-22 1 views
0

Das Problem ist, dass das rote Rechteck nicht auf der Benutzeroberfläche angezeigt wird.MVVM-Muster: IDataErrorInfo-Validierung funktioniert nicht, wenn wir das Modell in ein anderes Modell eingepackt haben

Ich benutze Caliburn.Micro und das ist das, was ich in meinem Ansicht haben:

<StackPanel Grid.Row="0"> 
    <Label>Customer name:</Label> 
    <TextBox x:Name="txtName" Text="{Binding Target.Model.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Width="136" HorizontalAlignment="Left"/> 
</StackPanel> 

Hier ist die Ansichtsmodell:

internal class ShellViewModel : Screen 
{ 
    private EditableCustomer _Target; 
    public EditableCustomer Target 
    { 
     get { return _Target; } 
     set { if (_Target != value) { _Target = value; NotifyOfPropertyChange(nameof(Target)); } } 
    } 
} 

Dies ist, was ich in der haben Modell:

internal class EditableCustomer : PropertyChangedBase, IDataErrorInfo 
{ 
    private CustomerInfo _Model; 
    public CustomerInfo Model 
    { 
     get { return _Model; } 
     set { if (_Model != value) { _Model = value; NotifyOfPropertyChange(nameof(Model)); } } 
    } 

} 

Und das ist ein weiteres Modell:

internal class CustomerInfo : PropertyChangedBase 
{ 
    private string _Name; 
    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; NotifyOfPropertyChange(nameof(Name)); } 
    } 
} 

Ich weiß, ich IDataErrorInfo Schnittstelle von EditableCustomer zu Customer Modell bewegen kann und alles funktioniert perfekt, wenn ich so tun, aber das Problem ist, dass ich nicht erlaubt bin Um Änderungen im CustomerInfo-Modell vorzunehmen,

Hat jemand eine Idee, was ich noch tun kann?

+0

Wo binden Sie Ihre Textbox an Fehlerstil? – FCin

+0

Was ist ein Fehlerstil? Entschuldigung, ich verstehe deine Frage nicht. Ich weiß nur, dass ich IDataErrorInterface zu CustomerInfo bewegen kann und dann alles gut funktioniert. – Navuhodonosor

+0

Wo speichern Sie Informationen zur Anzeige Ihres Fehlers? 'IDataError' validiert nur Daten, es kann Ihre Fehler nicht anzeigen. Hier ist ein Beispiel für das Formatieren Ihrer Fehler: http://stackoverflow.com/questions/14023552/how-to-use-idataerrorinfo-error-in-a-wpf-program – FCin

Antwort

0

Hat jemand eine Idee was ich noch tun kann?

Da es die Klasse der Daten gebunden Eigenschaft, die die IDataErrorInfo Schnittstelle implementieren sollten Sie werden dann auf eine Eigenschaft der EditableCustomer Klasse binden müssen, die die Eigenschaft Name des Customer Modell wickelt:

<TextBox x:Name="txtName" Text="{Binding Target.NameWrapper, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Width="136" HorizontalAlignment="Left"/> 

internal class EditableCustomer : PropertyChangedBase, IDataErrorInfo 
{ 
    private CustomerInfo _Model; 
    public CustomerInfo Model 
    { 
     get { return _Model; } 
     set { if (_Model != value) { _Model = value; NotifyOfPropertyChange(nameof(Model)); } } 
    } 

    //bind to this one instead of binding directly to the Name property of the model: 
    public string NameWrapper 
    { 
     get { return _Model.Name; } 
     set { _Model.Name = value; NotifyOfPropertyChange(nameof(NameWrapper)); } 
    } 

} 

Sie werden entweder, dies zu tun oder die Customer Klasse des IDataErrorInfo Schnittstelle implementieren lassen. Wählen und wählen.

0

Verwenden Sie die Flüssigkeitsvalidierung in xaml.

public class ModelValidator : AbstractValidator<Customer> 
{ 
public ModelValidator(){ 
    RuleFor(model => model.Name).NotEmpty().WithMessage("Name is Requried"); 
    RuleFor(model => model.Age).NotEmpty().WithMessage("Age is Required"); 
    RuleFor(model => model.Designation).NotEmpty().WithMessage("Choose Your Designation"); 
} 
} 

Dies wird Hilfe für Validierungen in WPF sein.

Sobald Sie über fluidValidations beziehen.

Verwandte Themen