Как сказал default.kramer , вам необходимо удалить RelativeSource
из ваших привязок для SelectedItem
и SelectedValue
следующим образом (обратите внимание, что вы должны добавить Mode=TwoWay
к вашей привязке так,что изменение в выпадающем списке отражается в вашей модели).
<DataGridTemplateColumn Header="House Owner">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding Path=DataContext.Owners, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedItem="{Binding HouseOwner, Mode=TwoWay}"
SelectedValue="{Binding HouseOwner.ID}"
SelectedValuePath="ID"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Однако, в отличие от него, вам не нужно удалять привязку для SelectedValue
.На самом деле, если вы удалите его, он не будет работать (здесь должны быть установлены и SelectedValue
, и SelectedValuePath
, как вы уже сделали), потому что это то, что позволяет механизму привязки идентифицировать выбор из выпадающего списка дляСвойство DataGrid HouseOwner
.
SelectedValue
/ SelectedValuePath
очень интересно.SelectedValuePath
сообщает привязке данных, что свойство ID
выбранного Owner
объекта представляет его значение , SelectedValue
сообщает, что это значение должно быть привязано к HouseOwner.ID
, который выбранобъект в DataGrid.
Поэтому, если вы удалите эти привязки, единственное, что механизм привязки данных узнает, это «какой объект выбран» и соответствие между выбранным элементом в ComboBox и HouseOwner
свойство выбранного элемента в DataGrid, они должны быть «одной и той же ссылкой на объект».Это означает, что, например, следующее не будет работать:
Owners = new ObservableCollection<Owner>
{
new Owner {ID = 1, Name = "Abdou"},
new Owner {ID = 2, Name = "Moumen"}
};
Houses = new ObservableCollection<House>
{
new House {ID = 1, HouseOwner = new Owner {ID = 1, Name = "Abdou" }},
new House {ID = 2, HouseOwner = new Owner {ID = 2, Name = "Moumen"}}
};
(обратите внимание, что «Домовладельцы» из коллекции «Дома» отличаются (новые) от тех, что в коллекции «Владельцы»).Тем не менее, следующие будут работать:
Owners = new ObservableCollection<Owner>
{
new Owner {ID = 1, Name = "Abdou"},
new Owner {ID = 2, Name = "Moumen"}
};
Houses = new ObservableCollection<House>
{
new House {ID = 1, HouseOwner = Owners[0]},
new House {ID = 2, HouseOwner = Owners[1]}
};
Надеюсь, это поможет:)
Обновление: во втором случае, вы можете получитьтот же результат без совпадения ссылок путем переопределения Equals в классе Owner
(естественно, так как он используется для сравнения объектов в первую очередь).(спасибо @ RJ Lohan за то, что отметили это в комментариях ниже)