我将MVVM与WPF结合使用是一个初学者。我可以处理简单的事情,但我目前正在努力解决以下问题。
假设我有一个TravelPlan对象。 TravelPlan有一个Cities对象(基本上是该计划将按特定顺序访问的所有城市的集合)。
使用动态控件呈现城市。它显示了可能城市的下拉框,加号(+)和减号( - )按钮。每当您按下+按钮时,都会出现一个新的空下拉列表供您选择。
我用TravelPlan的viewmodel和City的单独viewmodel创建了这个(见下文)。我添加了验证,以便 选择一个城市。
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中,因为单个城市并不了解所选的所有其他城市。
理想情况下,我想在自己的ViewModel中转换CityViewModel的ObservableCollection。然后,我可以将唯一验证添加到该特定视图模型。我相信我也可以将动态用户控件的逻辑移动到该视图模型。
这将创建以下层次结构:TravelPlanViewModel - CitiesViewModels - CityViewmodel,其中每个viewmodel执行其特定验证。
这是可能的,这是推荐的吗?我想知道人们如何以MVVM方式解决这个特定的设计问题。 (我知道可以将唯一验证移动到TravelPlan视图模型中,但我想知道我描述的场景是否可行并且是一种常见做法。)
代码示例高度赞赏!
答案 0 :(得分:0)
实现集合视图模型并不是闻所未闻 - 只需google&#34; CollectionViewModel&#34;看一些例子。但是,如果您所做的只是添加验证,我可能不会在其自己的视图模型中包装该集合。我只是将唯一性验证添加到您的根视图模型中,因为约束似乎与TravelPlan
更强烈相关。
所以,是的,这是可能的。我不知道共同是怎样的;我个人不这样做,但至少还有其他人有。