ComboBox ItemsSource изменен => SelectedItem разрушен

Хорошо, это уже некоторое время меня беспокоит. И мне интересно, как другие обрабатывают следующий случай:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding SelectedItem}"/>

Код объекта DataContext:

public ObservableCollection<MyItem> MyItems { get; set; }
public MyItem SelectedItem { get; set; }

public void RefreshMyItems()
{
    MyItems.Clear();
    foreach(var myItem in LoadItems()) MyItems.Add(myItem);
}

public class MyItem
{
    public int Id { get; set; }
    public override bool Equals(object obj)
    {
        return this.Id == ((MyItem)obj).Id;
    }
}

Очевидно, когда вызывается метод RefreshMyItems () , поле со списком получает события Collection Changed, обновляет свои элементы и выполняет не найти SelectedItem в обновленной коллекции => устанавливает для SelectedItem значение null . Но мне понадобится поле со списком, чтобы использовать метод Equals для выбора правильного элемента в новой коллекции.

Другими словами, коллекция ItemsSource по-прежнему содержит правильный MyItem , но это новый объект. И я хочу, чтобы в поле со списком использовалось что-то вроде Equals , чтобы выбрать его автоматически (это еще сложнее, потому что сначала исходная коллекция вызывает Clear () , которая сбрасывает коллекцию, и уже при этом точка SelectedItem имеет значение null ).

ОБНОВЛЕНИЕ 2 Перед копированием кода ниже обратите внимание, что он далек от совершенства! И обратите внимание, что по умолчанию он не связывается двумя способами. <%= f.select :source_type, options_for_select(["lead","vteam"],["lead"]) %> On first line every thing ...

<%= f.association :opportunity_status, :label => "Status", :input_html => {} %>
<%= f.select :source_type, options_for_select(["lead","vteam"],["lead"]) %>

On first line every thing is OK. On second line if I attach label the way I did in first line it show an error.

How can I specify label for select using simpleform?

17
задан Mike Vormwald 5 July 2013 в 19:52
поделиться