Вы слишком сильно привязываетесь; вам нужно только установить SelectedValue
и SelectedValuePath
или SelectedItem
. В этом случае, похоже, что вы на самом деле пытаетесь привязать к определенному объекту. Если вы пытаетесь установить ComboBox
свойство Category
на вашем Book
, а текущий объект Book
фактически имеет ссылку на экземпляр Category
, который находится в categoryList
, тогда вам следует использовать SelectedItem
переплет и удаление привязок для SelectedValue
и SelectedValuePath
.
Редактировать
Чтобы немного рассказать о том, как это делается, SelectedValue
предназначен для использования, когда у вас есть общая часть информации, чтобы связать связанный элемент со свойством в источнике списка. Например, допустим, у меня есть класс Book
со свойством CategoryID
.
public class Book
{
public string CategoryID { get; set; }
public string Title { get; set; }
}
public class CategoryID
{
public string ID { get; set; }
public string Name { get; set; }
}
В этом случае вы должны сделать:
<ComboBox SelectedValue = "{Binding CategoryID}"
SelectedValuePath = "ID"
DisplayMemberPath = "Name" />
SelectedItem
, с другой стороны, для случая, когда связанный экземпляр имеет фактическую ссылку на (или, точнее, объект, который эквивалентен) элементу в связанном списке. Итак, давайте предположим, что класс Book
на самом деле выглядит так:
public class Book
{
public Category Category { get; set; }
public string Title { get; set; }
}
В этом случае вы должны сделать:
<ComboBox SelectedItem = "{Binding Category}"
DisplayMemberPath = "Name" />
Но очень важно отметить, что это не сработает, если класс Book
не имеет ссылку на тот же экземпляр Category
, как в списке . Если ссылки различаются (даже если значения классов равны), это не сработает, поскольку ComboBox
не сможет найти Category
, на который есть ссылка в Book
в списке.
Реальная проблема с тем, как вы связывали его сверху (связывая с Category.ID
), заключается в том, что вы смешиваете схемы. У вас есть ссылка, но вместо этого вы пытаетесь связать ключ. Все, что вам нужно сделать, это попытаться установить значение для вашей ссылки, он не будет пытаться изменить ссылку для вашего класса .