2016-12-22 23 views
0

問題是未在UI上顯示紅色矩形。MVVM模式:如果我們在另一個模型中包裝了模型,則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> 

這裏是視圖模型

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

我知道我可以從EditableCustomer移動IDataErrorInfo的接口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的接口,那麼你就需要綁定到一個封裝了CustomerInfo模型的名稱屬性EditableCustomer類的屬性屬性的類數據:

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