2009-07-28 3 views
1

У меня есть два комбо «Make» и «Model», у них есть свойства SelectedValue, привязанные к объекту Vehicle с ModelID и MakeID.WPF Binding: Refreshing Binding после перезагрузки комбо из базы данных

Heres модели ...

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

Пользователь может искать автомобиль в отдельном контроле и это обменивает вне базовый объект Vehicle. Все работает нормально, если вы переключаетесь между транспортными средствами одного и того же 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

Спасибо вам за помощь, в конце концов это сделал трюк, и я предпочитаю его к моему первому обходному пути.

Кажется, это хорошо для меня, но я думаю, что другие могут задохнуться от ужаса? Пожалуйста, не стесняйтесь комментировать, если это так!

ModelSpecs находится на моем ManageVehicleViewModel, поэтому dosnt кажется неуместным, чтобы иметь дополнительный вызов PropertyChanged.

private IEnumerable<ModelSpec> _modelSpecs; 
    public IEnumerable<ModelSpec> ModelSpecs 
    { 
     get 
     { 
      return _modelSpecs; 
     } 
     set 
     { 
      if (_modelSpecs == value) return; 
      _modelSpecs = value; 
      OnPropertyChanged("ModelSpecs"); 
      OnPropertyChanged("Vehicle"); 
     } 
    } 
0

Ну, это, вероятно, просто еще одно «неэлегантное» решение, но еще один правильный способ - получить BindingExpression из combo-box и позвонить BindingExpression.UpdateSource.

+0

Его код и его теги предполагают, что он использует Model-View-ViewModel, что сделало бы это no-no. –

1

Сделайте только ModelSpec коллекцию наблюдаемым (например, реализуйте INotifyCollectionChanged самостоятельно или используйте для этого класс ObservableCollection).