質問

が最良の実践例または広く受け入れられ方の構造化と検証データを使用ョ連リアサービスをSilverlight?

この世界の問題です。ということかを持っEmployeeView,EmployeeViewModelや従業員の団体をいう。通常のリまくる従業員の企業にとデニースザメネースパークからの検証"無料"での実施主体INotifyDataErrorInfoとIDataErrorInfo(訂正?).

さて、いく一部の従業員の特性によりViewModelの代わりに直接又はそれなりに複雑になる。私はさらにビットを必要とすることを直接フックとして、企業のバックエンドのように、この:

    private Employee _employee;

    public EmployeeViewModel()
    {
        _employee = new Employee();
    }

    public string Name
    {
        get { return _employee.Name; }
        set
        {
            _employee.Name = value;
            // fire property change, etc.
        }
    }

...が失わなければならなかったのは、おいしい"無料"で検証機関となった。その他のいかなる企業の直接のモデルはこのように

    private Employee _employee;
    public Employee Employee
    {
        get { return _employee; }
    }

    public EmployeeViewModel()
    {
        _employee = new Employee();
    }

この場合、ビューの結合に直接従業員の主体とアーティス物件があり、このように:

<StackPanel DataContext="{Binding Employee}">
    <TextBox Text="{Binding Name}" />
</StackPanel>

この方法を用いた"無料"で検証ではもうクリーンの実施ョ.

第三のオプションを実施INotifyDataErrorInfoとIDataErrorInfo自分のVmがこのようなひど多くの配管コードを考慮し、わかりやすくするために使えるようになったので、上記の解決というやや下"クリーン"が体の多くりのまま出入り可能です。

でも私の質問は、これらのアプローチに適するものですか。あうためのより良いアプローチを思欠?

との関連を探しているCaliburn.マイクロョ枠組みがいて答えくださ般.

役に立ちましたか?

解決

私はCaliburn.MicroでRIAを使用して、クライアント側の検証のための私の解決策とはかなり満足していています。

私が行っていること(Caliburn.Micro提供)ValidationBaseViewModel、私の実際のアプリケーションVM(あなたのケースでScreen)との間にEmployeeViewModelを入れています。あなたが話している配管コードは一度だけ書かれているので、ValidationBaseViewModel用具はINotifyDataErrorInfo。私は、追加/削除の/次のコードで(Caliburn.Micro)ValidationBaseViewModelのオーバーライドからPropertyChangedBase.NotifyOfPropertyChangeを介してエラーを通知

public override void NotifyOfPropertyChange(string property)
{
    if (_editing == null)
        return;

    if (HasErrors)
        RemoveErrorFromPropertyAndNotifyErrorChanges(property, 100);

    if (_editing.HasValidationErrors)
    {
        foreach (var validationError in
                       _editing.ValidationErrors
                               .Where(error => error.MemberNames.Contains(property)))
        {
            AddErrorToPropertyAndNotifyErrorChanges(property, new ValidationErrorInfo() { ErrorCode = 100, ErrorMessage = validationError.ErrorMessage });
        }
    }

    base.NotifyOfPropertyChange(property);
}

これは、次の定義と(ValidationBaseViewModelとEmployeeViewModel間の)別のVMに実際にある

public abstract class BaseEditViewModel<TEdit> :
                                ValidationBaseViewModel where TEdit : Entity
EntityはリアスSystem.ServiceModel.DomainServices.Client.Entity_editingクラスメンバーである

は、現在のVMによって編集されているこのタイプTEditのインスタンスである。

カリバーンとの組み合わせでは、これは私は次のようにいくつかのクールなものを行うことができますコルーチンます:

[Rescue]
public IEnumerable<IResult> Save()
{
    if (HasErrors)
    {
        yield return new GiveFocusByName(PropertyInError);
        yield break;
    }

    ...
}

他のヒント

したいという場合などに使用外部のリソースまたは枠組みそきり ViewModelBase を実装する INotifyDataErrorInfo.

スク以外のリスクについて ValidateProperty(string propertyName, object value) の有効性を実証speciic財産 Validate() 方法を検証するために全体のオブジェクトです。内部での利用 Validator クラスを返します ValidationResults.
ご利用の場合は、反射板、でき も簡単 を模倣による検証プロセスの Entity クラス自体の ViewModelBase.

ではないが"無料"では、まだ比較的安価なカント.

ここではサンプルの実施 IDataErrorInfo.がなさまのアイデアです。

public class ViewModelBase : INotifyPropertyChanged, INotifyDataErrorInfo
{

  /*
   * InotifyPropertyChanged implementation
   * Consider using Linq expressions instead of string names
   */

  public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
  public IEnumerable GetErrors(string propertyName)
  {
    if (implValidationErrors == null) return null;
    return ImplValidationErros.Where(ve =>
      ve.MemberNames.Any(mn => mn == propertyName));
  }

  public bool HasErrors
  {
    get
    {
      return implValidationErrors == null || ImplValidationErros.Any();
    }
  }

  private List<ValidationResult> implValidationErrors;
  private List<ValidationResult> ImplValidationErros
  {
    get
    {
      return implValidationErrors ?? 
        (implValidationErrors = new List<ValidationResult>());
    }
  }
  private ReadOnlyCollection<ValidationResult> validationErrors;
  [Display(AutoGenerateField = false)]
  protected ICollection<ValidationResult> ValidationErrors
  {
    get
    {
      return validationErrors ?? 
        (validationErrors =
        new ReadOnlyCollection<ValidationResult>(ImplValidationErros));
    }
  }
  protected void ValidateProperty(string propertyName, object value)
  {
    ValidationContext validationContext =
      new ValidationContext(this, null, null);
    validationContext.MemberName = propertyName;
    List<ValidationResult> validationResults =
      new List<ValidationResult>();

    Validator.TryValidateProperty(
      value, 
      validationContext, 
      validationResults);

    if (!validationResults.Any()) return;

    validationResults
      .AddRange(ValidationErrors
      .Where(ve =>
        !ve.MemberNames.All(mn =>
          mn == propertyName)));

    implValidationErrors = validationResults;

    if (ErrorsChanged != null)
      ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
  }
}

あなたがそこには、経由idataerrorinfoあなたのエンティティを拡張し、データ検証を追加する部分クラスを使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top