1

我有两个组合的“Make”和“Model”,它们的 SelectedValue 属性绑定到具有 ModelID 和 MakeID 的 Vehicle 对象。

继承人模型...

<ComboBox DisplayMemberPath="Description" ItemsSource="{Binding Path=ModelSpecs}" SelectedValue="{Binding Path=Vehicle.ModelID}" SelectedValuePath="ID" />

用户可以在单独的控件中搜索 Vehicles,这会换出底层的 Vehicle 对象。如果您在相同 Make 的车辆之间切换一切正常,但是如果 Make 更改,我会转到数据库并重新加载 ModelSpec 集合。组合不会显示模型描述,因为需要刷新绑定。

我目前的解决方法是在重新加载模型的方法的末尾添加它 - 它工作正常,但不是一个特别优雅的解决方案。

        var modelID = ViewModel.Vehicle.ModelID;
        ViewModel.Vehicle.ModelID = string.Empty;
        ViewModel.Vehicle.ModelID = modelID;

基本上我只是触发 INotifyPropertyChanged ...

    private string _modelID;
    public string ModelID
    {
        get { return _modelID; }
        set 
        {
            if (_modelID == value) return;
            _modelID = value;
            OnPropertyChanged("ModelID");
        }
    }

我能想到几个类似的不优雅的解决方案——但一定有更好的方法吗?!任何帮助表示赞赏!

4

3 回答 3

1

只需使ModelSpec集合可观察(即实现INotifyCollectionChanged自己,或使用ObservableCollection类)。

于 2009-07-28T17:20:08.173 回答
0

好吧,这可能只是另一种“不雅”的解决方案,但一种更正确的方法是从组合框中获取 BindingExpression 并调用BindingExpression.UpdateSource

于 2009-07-28T17:10:01.673 回答
0

感谢您的帮助,最后这成功了,我更喜欢它而不是我的第一个解决方法。

对我来说似乎很好,但我想其他人可能会惊恐地喘着粗气?如果有,请随时发表评论!

ModelSpecs 在我的 ManageVehicleViewModel 上,所以它似乎不适合进行额外的 PropertyChanged 调用。

    private IEnumerable<ModelSpec> _modelSpecs;
    public IEnumerable<ModelSpec> ModelSpecs
    {
        get
        {
            return _modelSpecs;
        }
        set
        {
            if (_modelSpecs == value) return;
            _modelSpecs = value;
            OnPropertyChanged("ModelSpecs");
            OnPropertyChanged("Vehicle");
        }
    }
于 2009-07-30T15:41:15.947 回答