与嵌套视图模型相结合的验证设计问题
本文关键字:验证 问题 相结合 嵌套 视图 模型 | 更新日期: 2023-09-27 18:29:25
我对将MVVM与WPF结合使用有点初学者。我可以处理简单的事情,但我目前正在为以下问题而挣扎。
假设我有一个TravelPlan对象。TravelPlan有一个Cities对象(基本上是该计划将按特定顺序访问的所有城市的集合)。
城市采用动态控制。它显示了一个可能城市的下拉框,一个加号(+)和减号(-)按钮。每当您按下+按钮时,就会出现一个新的空下拉列表供您选择。
我为TravelPlan创建了一个视图模型,并为一个城市创建了单独的视图模型(见下文)。我添加了验证,以便可以选择一个城市。
public class CityViewModel : DataErrorInfoViewModel
{
private readonly IEnumerable<string> _availableCities;
private string _selectedCity;
public CityViewModel(IEnumerable<string> availableCities)
{
_availableCities = availableCities;
}
public string SelectedCity
{
get { return _selectedCity; }
set
{
_selectedCity = value;
RaisePropertyChanged(() => SelectedCity);
}
}
public IEnumerable<string> AvailableCities
{
get { return _availableCities; }
}
protected override bool Validate(string propertyName)
{
var isValid = base.Validate(propertyName);
if (MatchesProperty(() => SelectedCity, propertyName))
{
isValid = SelectedCity != null;
}
return isValid;
}
}
在TravelPlan视图模型中,我只使用CityViewModel。
private ObservableCollection<CitiesViewModel> _cities;
在TravelPlan视图模型中,我还实现了+/-按钮。他们只需添加或删除城市视图模型。
这非常有效。
但是,我还想添加验证,看看所选城市的组合是否唯一(即,不能两次选择同一个城市)。我不能将其添加到单个CityViewModel中,因为一个城市不知道所选的所有其他城市。
理想情况下,我希望将城市视图模型的ObservableCollection转换为自己的视图模型。然后,我可以将唯一的验证添加到特定的视图模型中。我相信我也可以将动态用户控件的逻辑转移到视图模型中。
这将创建以下层次结构:TravelPlanViewModel-CitiesViewModels-CityViewmodel,其中每个视图模型都进行特定的验证。
这可能吗?建议这样做吗?我想知道人们是如何以MVVM的方式解决这个特定的设计问题的。(我知道可以将唯一的验证转移到TravelPlan视图模型中,但我想知道我描述的场景是否可行,是否是一种常见的做法)。
非常感谢代码示例!
实现集合视图模型并非闻所未闻——只需谷歌"CollectionViewModel"即可查看一些示例。然而,如果您所做的只是添加验证,我可能不会麻烦将集合包装在它自己的视图模型中。我只想将唯一性验证添加到根视图模型中,因为约束似乎与TravelPlan
更密切相关。
所以,是的,这是可能的。我不知道有多普遍;我个人不这么做,但至少其他人也这么做了。