与嵌套视图模型相结合的验证设计问题

本文关键字:验证 问题 相结合 嵌套 视图 模型 | 更新日期: 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更密切相关。

所以,是的,这是可能的。我不知道有多普遍;我个人不这么做,但至少其他人也这么做了。