Вы можете сделать следующее:
<ComboBox
ItemsSource="{Binding ListB}"
SelectedItem="{Binding SelectedB}"
DisplayMemberPath="Name" Width="100"
/>
Кроме того, вы можете добавить следующий код в вашу ViewModel:
private ObservableCollection<B> listB = new ObservableCollection<B>();
public ObservableCollection<B> ListB
{
get { return this.listB; }
set { this.listB = value; NotifyPropertyChanged("ListB"); }
}
private B selectedB;
public B SelectedB
{
get { return this.selectedA; }
set { this.selectedB = value; NotifyPropertyChanged("SelectedA"); }
}
ViewModel()
{
//Fill your ListB with all possible values
this.SelectedB=ListB.FirstOrDefault(x=>x.ID==A.ObjectB.ID)
}
Тогда ваши классы могут быть INotifyPropertyChanged:
public class A : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public long ID=-1;
private string name = "";
public string Name
{
get { return this.name; }
set
{
this.name = value;
this.NotifyPropertyChanged("Name");
}
}
private B objectB;
public B ObjectB
{
get{return this.objectB;}
set
{
this.objectB=value;
this.NotifyPropertyChanged("B");
}
}
}
Я почти уверен, что вы также можете заменить SelectedB на A.ObjectB для привязки, но вам нужно будет провести несколько тестов, чтобы проверить это. Преимущество (или неудобство в зависимости от обстоятельств) состоит в том, что если вы выполняете привязку к A.ObjectB, изменения вступят в силу, как только вы измените выбранный элемент в ComboBox. Сделав так, чтобы вы могли изменить значение своего ComboBox, не изменяя напрямую свой объект A, затем при закрытии Window вы можете запросить сохранение или нет, и если да, просто выполните A.ObjectB = SelectedB.