我有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}
的原因。
问题是更新视图模型的最佳方法是什么。
我有两种方法可以做到:
TaskViewModel
类型的属性添加到实例,并将其所有属性绑定到视图,而不是使用ICommand
更新主实例中的属性(如果所有验证规则都在执行)。但在这种情况下,我需要保留对象的完整副本。"{Binding Mode=TwoWay, UpdateSourceTrigger=Explicit}"
获取必要的属性,而使用事件处理程序使用代码隐藏调用binding.UpdateSource()
。但在这种情况下,我必须在代码隐藏中实现验证逻辑,这在mvvm方法中看起来很糟糕。您可能应该为此任务推荐最佳方式。 提前谢谢。
更新:
例如典型的验证案例,Title
不能为空。如果我更改了Title
属性"购买牛奶"到"买mi"它会有效,但我不想在每次更改每个属性后更新我的模型并将其保存到存储中。所以我必须实现SaveCommand
来更新模型。但是我还需要回滚所有更改,因此我无法使用Mode=TwoWay
绑定直接更改当前视图模型属性。
所以问题是如果有效的话,如何根据需要更新所有已更改的属性?