У меня есть (как мне кажется) очень простой сценарий, который я не могу понять.Я искал здесь (т. Е. StackOverflow.com) для решения, но не могу найти никого с моей точной проблемой.Я не сортирую свой список по критериям;Я просто хочу, чтобы мой список отображал порядок элементов в моей коллекции.
Я использую Caliburn.Micro для привязки базовой коллекции к списку WPF ListBox.Я просто хочу, чтобы пользователь мог перемещать элементы вверх и вниз по списку, используя предоставленные мной кнопки.Функциональность отлично работает!Однако ListBox не будет отражать порядок новой коллекции.
Вот простой ViewModel:
public class MyViewModel : PropertyChangedBase
{
private readonly IObservableCollection<SimpleItem> _items;
private SimpleItem _selectedItem;
public MyViewModel()
{
_items = new BindableCollection<SimpleItems>();
_items.Add(new SimpleItem("Item 1"));
_items.Add(new SimpleItem("Item 2"));
_items.Add(new SimpleItem("Item 3"));
}
public IObservableCollection<SimpleItem> Items
{
get { return _items; }
}
public SimpleItem SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
NotifyOfPropertyChanged(() => SelectedItem);
}
}
}
Вот Xaml, который привязывается к моей ViewModel (опять же, используя Caliburn.Micro):
<ListBox x:Name="Items">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Caption}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Результатыотобразите элементы в моем ListBox идеально:
Item 1
Item 2
Item 3
Теперь предположим, что пользователь хочет переместиться на Item 2
выше Item 1
.Они выбирают Item 2
, а затем нажимают кнопку с именем MoveUp
.В моей ViewModel есть метод MoveUp (), который выполняет следующую логику (упрощенно для краткости):
public void MoveUp()
{
var item = SelectedItem;
var index = Items.IndexOf(item);
Items.Remove(item);
Items.Insert(index - 1, item);
SelectedItem = item;
}
К сожалению, ListBox не отражает новый порядок ... Какой самый лучший способскажите мнение, что список для обновления дисплея без прибегает к выделенному коду?
ОБНОВЛЕНИЕ: 20 июля 2011 г.
Я обнаружил проблему.Проблема заключалась в том, что моя коллекция SimpleItems была фактически подмножеством родительского «SimpleItem».Поэтому, когда пользователь нажимает «MoveUp», я выполняю поиск родительского SimpleItem и ссылаюсь на его дочерние элементы напрямую.Проблема заключалась в том, что дети не были связаны с экземпляром IObservableCollection.Вместо этого мне пришлось изменить свою логику, чтобы найти наблюдаемую коллекцию, и теперь она работает!Спасибо @devdigital за помощь!
- = Люк