Хорошо, это уже некоторое время меня беспокоит. И мне интересно, как другие обрабатывают следующий случай:
<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?