WPF绑定:从数据库重新加载组合后刷新绑定

时间:2009-07-28 16:51:24

标签: wpf binding prism composite mvvm

我有两个组合'Make'和'Model',他们将SelectedValue属性绑定到一个带有ModelID和MakeID的Vehicle对象。

Heres Model ...

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

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

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

        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");
        }
    }

我可以想到几个类似的不优雅的解决方案 - 但必须有更好的方法吗?!任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分: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");
        }
    }