我有两个组合'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");
}
}
我可以想到几个类似的不优雅的解决方案 - 但必须有更好的方法吗?!任何帮助表示赞赏!
答案 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");
}
}