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

时间:2014-11-05 14:03:31

标签: c# wpf mvvm

我将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视图模型中,但我想知道我描述的场景是否可行并且是一种常见做法。)

代码示例高度赞赏!

1 个答案:

答案 0 :(得分:0)

实现集合视图模型并不是闻所未闻 - 只需google&#34; CollectionViewModel&#34;看一些例子。但是,如果您所做的只是添加验证,我可能不会在其自己的视图模型中包装该集合。我只是将唯一性验证添加到您的根视图模型中,因为约束似乎与TravelPlan更强烈相关。

所以,是的,这是可能的。我不知道共同是怎样的;我个人不这样做,但至少还有其他人有。