0

スカラープロパティとコレクションプロパティを含むMyViewModelがあります

public class MyViewModel :
    System.ComponentModel.INotifyPropertyChanged,
    System.ComponentModel.IDataErrorInfo
{
    public MyViewModel()
    {
        List<SelectableObject> list = new List<SelectableObject>();
        foreach (var weekDay in System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames)
        {
            list.Add(new SelectableObject() { Name = weekDay, IsSelected = false });
        }
        WeekDays = list;
    }
    public string Catalog { get; set; }
    public DateTime CreationTime { get; set; }
    public DateTime ModificationTime { get; set; }

    public IEnumerable<SelectableObject> WeekDays { get; private set; }

    public ICommand SaveCommand { get; private set; }

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            var errorResult = string.Empty;

            switch (columnName)
            {
                case "CreationTime":
                    // Validation logic
                    break;
                case "ModificationTime":
                    // Validation logic
                    break;
                default:
                    break;
            }

            return errorResult;
        }
    }
}

SelectableObjectクラス:

public class SelectableObject : System.ComponentModel.INotifyPropertyChanged
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

SaveCommandを介して<Button/>のIsEnabledプロパティを操作したいのですが、フォームにエラーがない場合にのみ有効にします。しかし、これを検証する方法がわかりません。少なくとも1つのWeekDayを選択する必要がありました。

はい、WeekDaysコレクション内のすべてのオブジェクトのPropertyChangedイベントをリッスンできますが、この場合、検証ロジックはIDataErrorInfoインターフェイスから分離されます。

この問題の解決策はありますか?コレクションの検証ロジックをIDataErrorInfoインターフェイスに配置するにはどうすればよいですか?

4

1 に答える 1

1

canexecuteでロジックを実行するだけですか?

ビューモデル:

private DelegateCommand _save;

public ICommand SaveCommand
{
  get {return this._save ?? (this._save = new DelegateComamnd(this.MyExecuteMethod, this.MyCanExecuteMethod));}
 }

private bool MyCanExecuteMethod()
{
   return this.WeekDays.Any(x=>x.IsSelected) && string.IsNullOrWhiteSpace(this.Error);
}

ps: エラーがある場合、エラーは空ではないはずです。

于 2012-07-30T07:36:29.387 に答える