2016-12-22 5 views
0

빨간색 사각형이 UI에 표시되지 않는 것이 문제입니다.MVVM 패턴 : 다른 모델에 모델을 래핑 한 경우 IDataErrorInfo 유효성 검사가 작동하지 않습니다.

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

뷰 모델입니다 :

내가 Caliburn.Micro를 사용하고 이것이

내가 내 보기에있는 것입니다

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

이 내가이 무엇인지입니다 모델 :

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

} 

그리고 이것은 또 다른 모델입니다 :

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

내가 CustomerInfo 모델에 EditableCustomer에서 IDataErrorInfo 인터페이스를 이동할 수 있습니다 알고 내가 그렇게하면 모든 것이 완벽하게 작동하지만 문제는 내가 허용되지 않아이다 고객 정보 모델을 변경하려면

다른 사람이 내가 뭘 할 수 있는지 알지 못합니까?

+0

텍스트 상자를 오류 스타일에 어디에 바인딩합니까? – FCin

+0

오류 유형이란 무엇입니까? 죄송합니다. 귀하의 질문을 이해할 수 없습니다. IDataErrorInterface를 CustomerInfo로 옮길 수 있다는 것을 알았습니다. 그런 다음 모든 것이 잘 작동합니다. – Navuhodonosor

+0

오류를 표시하는 방법에 대한 정보는 어디에 저장합니까? 'IDataError'는 데이터의 유효성 만 검사합니다. 오류를 표시하는 방법을 알지 못합니다. 다음은 오류 스타일을 지정하는 예제입니다. http://stackoverflow.com/questions/14023552/how-to-use-idataerrorinfo-error-in-a-wpf-program – FCin

답변

0

아무에게도 내가 할 수있는 다른 아이디어가 있습니까?

당신이 다음 CustomerInfo 모델의 Name 속성을 감싸는 EditableCustomer 클래스의 속성에 바인딩해야하는 IDataErrorInfo 인터페이스를 구현해야합니다 특성 바인딩 된 데이터의 클래스이기 때문에 :

<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)); } 
    } 

} 

이 작업을 수행하거나 CustomerInfo 클래스는 IDataErrorInfo 인터페이스를 구현해야 할 것이다 중 하나. 선택하고 선택하십시오.

0

유체 사용 유효성 검사는 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"); 
} 
} 

이것은 wpf의 유효성 검사에 도움이됩니다.

일단 fluidValidations에 관해 언급하면.