如何根据需要更新复杂的ViewModel的最佳方法

时间:2015-12-22 09:54:44

标签: c# wpf xaml mvvm windows-runtime

我有TaskViewModel类有很多不同的属性。简化的代码如下:

internal class TaskViewModel : ViewModelBase
{
    private TaskModel _model;

    public long Id
    {
        get { return _model.Id; }
        set
        {
            _model.Id = value;
            RaisePropertyChanged("Id");
        }
    }

    public string Title
    {
        get { return _model.Title; }
        set
        {
            _model.Title = value;
            RaisePropertyChanged("Title");
        }
    }

    public DateTime? Date
    {
        get { return _model.Date; }
        set
        {
            _model.Date = value;
            RaisePropertyChanged("Date";);
        }
    }

    private RelayCommand _updateCommand;
    public RelayCommand UpdateCommand
    {
        get
        {
            return _updateCommand
                   ?? (_updateCommand = new RelayCommand(
                       () =>
                       {
                           // somehow update _model
                       }));
        }
    }
}

我有TaskView我可以编辑TaskViewModel的实例。此外,我还有一些验证规则,例如,如果Title为空,我无法更新模型,必须重新建立之前的Title。这就是我无法使用"{Binding Mode=TwoWay}的原因。 问题是更新视图模型的最佳方法是什么。 我有两种方法可以做到:

  1. TaskViewModel类型的属性添加到实例,并将其所有属性绑定到视图,而不是使用ICommand更新主实例中的属性(如果所有验证规则都在执行)。但在这种情况下,我需要保留对象的完整副本。
  2. 使用"{Binding Mode=TwoWay, UpdateSourceTrigger=Explicit}"获取必要的属性,而使用事件处理程序使用代码隐藏调用binding.UpdateSource()。但在这种情况下,我必须在代码隐藏中实现验证逻辑,这在mvvm方法中看起来很糟糕。
  3. 您可能应该为此任务推荐最佳方式。 提前谢谢。

    更新: 例如典型的验证案例,Title不能为空。如果我更改了Title属性"购买牛奶"到"买mi"它会有效,但我不想在每次更改每个属性后更新我的模型并将其保存到存储中。所以我必须实现SaveCommand来更新模型。但是我还需要回滚所有更改,因此我无法使用Mode=TwoWay绑定直接更改当前视图模型属性。

    所以问题是如果有效的话,如何根据需要更新所有已更改的属性?

0 个答案:

没有答案