У меня есть Activity
объект со многими свойствами. Один из них выглядит следующим образом:
public ActivityStatus Status
{
get { return status; }
set { status = value; NotifyPropertyChanged("Status"); }
}
Класс ActivityStatus
имеет только два свойства:
public Guid Guid
{
get { return guid; }
set { guid = value; NotifyPropertyChanged("Guid"); }
}
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); }
}
и Equals
методы:
public override bool Equals(object otherObject)
{
if (!(otherObject is ActivityStatus)) return false;
return Equals(otherObject as ActivityStatus);
}
public bool Equals(ActivityStatus otherStatus)
{
if (!(otherStatus is ActivityStatus) || otherStatus == null) return false;
return Guid == otherStatus.Guid && Name == otherStatus.Name;
}
У меня есть ActivityViewModel
класс как DataContext
класса ActivityView
. ActivityViewModel
имеет свойство Activity
типа Activity
и, среди прочего, свойство ActivityStatuses
типа ObservableCollection<ActivityStatus>
. В ActivityView
у меня есть ComboBox
, объявленный следующим образом:
<ComboBox ItemsSource="{Binding ActivityStatuses}"
SelectedItem="{Binding Activity.Status, Mode=TwoWay}"
DisplayMemberPath="Name" />
Это позволяет мне выбрать ActivityStatus
из ComboBox
и корректно обновляет свойство Status
Activity
в свойстве Activity
модели представления. Проблема заключается в двусторонней привязке ... при загрузке нового Activity
ComboBox.SelectedItem
не обновляется, чтобы показать значение свойства Activity.Status
.
Используя это объявление ComboBox
, SelectedItem
привязывается к объекту ActivityStatus
в Activity
, и этот объект отличается от объекта с теми же значениями в свойстве viewmodel ActivityStatuses
. Поэтому WPF Framework не считает, что элементы совпадают, и не выбирает элемент в ComboBox
.
Если я присваиваю элемент из коллекции с такими же значениями свойству Activity.Status
после загрузки каждого Activity
, тогда ComboBox
находит совпадение в своей коллекции ItemsSource
и правильно устанавливает свойство SelectedItem
отображение значения. Я действительно не хочу этого делать, потому что у меня есть много других аналогичных свойств в классе Activity
, и мне придется повторять этот код везде, где я хочу, чтобы выполнить двустороннее связывание с ComboBox
es.
Поэтому я также попытался связать свойство ActivityStatus.Guid
следующим образом:
<ComboBox ItemsSource="{Binding ActivityStatuses}"
SelectedValue="{Binding Activity.Status.Guid, Mode=TwoWay}"
SelectedValuePath="Guid"
DisplayMemberPath="Name" />
Это правильно выбрал объект с тем же Guid
, что и у свойства Activity.Status
из коллекции ComboBox.ItemsSource
при загрузке различных объектов Activity
. Проблема этого метода заключается в том, что SelectedValue
привязан к свойству ActivityStatus.Guid
в объекте ActivityStatus
, и поэтому при изменении значений в пользовательском интерфейсе обновляется только свойство «Guid» объекта ActivityStatus
, оставив имя без изменений. Объект в свойстве Activity.Status
не изменяется, за исключением значения его свойства Guid
.
Как вы можете видеть, я также пытался реализовать метод Equals
, так как предполагал, что ComboBox
будет использовать это для сравнения объектов, но это не имело никакого значения. Итак, наконец, я в растерянности и стремлюсь найти простой чистый способ решения этой проблемы ... надеюсь, есть простое свойство, которое я пропустил в ComboBox
.
Я просто хочу иметь возможность выбрать элемент в ComboBox
и соответственно изменить объект Activity.Status
и изменить значение свойства Activity.Status
из кода, а также обновить ComboBox.SelectedItem
соответственно. Буду благодарен за любой совет.
ОБНОВЛЕНИЕ >>>
Прочитав ответ Уилла, я попробовал его пример кода в новом решении и увидел, что он работает как ожидалось. Затем я внимательно изучил его код и увидел, что он такой же, как и у меня, поэтому снова применил свое собственное решение (впервые с этого поста). К моему полному удивлению, это сработало, как и ожидалось, без изменения кода!
Это сильно озадачило меня, и я потратил некоторое время, чтобы выяснить, что случилось. Оказывается, проблема была / есть Visual Studio 2010! В качестве последнего этапа я добавил методы Equals
к своим типам данных. По какой-то причине Visual Studio не создавал проект типов данных при запуске приложения.
Таким образом, приложение, должно быть, использовало более старый файл dll, и мои изменения не использовались ... Я действительно удивлялся, почему мои точки останова на методах Equals
никогда не были достигнуты. Это привело к моему предположению, что реализация метидов Equals
не помогла. Visual Studio сегодня ведет себя так же, и вот как я узнал, что произошло.
Я проверил порядок сборки проекта в своем решении, но в нем перечислены типы данных проекта в правильном месте в порядке.Однако при запуске приложения в окне «Вывод» в Visual Studio отображается библиотека проекта, загружаемая в другом порядке.Я не уверен, почему при запуске приложения больше не выполняется полная сборка, но, по крайней мере, я знаю, что мне нужно собрать этот проект после внесения в него изменений перед запуском приложения.1093 *
Я только что узнал, почему мой проект типов данных не строился ... Я посмотрел в окне Configuration Manager и увидел, что Платформа каким-то образом неверна для этого проекта, и флажок Build стал непроверенным!Я понятия не имею, как это произошло, но я очень рад, что наконец понял проблему.