2016-12-22 7 views
0

Проблема в том, что красный прямоугольник не отображается в пользовательском интерфейсе.MVVM pattern: проверка идентификатора IDataErrorInfo не работает, если мы обернули модель внутри другой модели

Я использую Caliburn.Micro и это то, что у меня в Вид:

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

Вот является ViewModel:

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

Я знаю, что могу двигаться интерфейс IDataErrorInfo от EditableCustomer к модели CustomerInfo и все будет прекрасно работать, если я делаю это, но проблема в том, что я не позволил внести изменения в модель CustomerInfo,

Кто-нибудь знает, что еще я могу сделать?

+0

Где вы привязываете свое текстовое поле к стилю ошибки? – FCin

+0

Что такое стиль ошибки? Извините, я не понимаю ваш вопрос. Я просто знаю, что могу перемещать IDataErrorInterface в CustomerInfo, а потом все работает отлично. – Navuhodonosor

+0

Где вы храните информацию о своей ошибке? 'IDataError' только проверяет данные, он не знает, как отображать ваши ошибки. Вот пример стилизации ваших ошибок: http://stackoverflow.com/questions/14023552/how-to-use-idataerrorinfo-error-in-a-wpf-program – FCin

ответ

0

Есть ли у кого-нибудь идеи, что еще я могу сделать?

Поскольку класс данных связаны свойства, которые должны реализовывать интерфейс IDataErrorInfo вам нужно будет привязать к свойству класса EditableCustomer, который описывает имя свойства модели CustomerInfo:

<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

Использование Fluid Validations будет легко в 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.

После того, как вы обратитесь к информации о жидкостиValidations.