Как отразить изменения заказа в списке WPF - PullRequest
0 голосов
/ 20 июля 2011

У меня есть (как мне кажется) очень простой сценарий, который я не могу понять.Я искал здесь (т. Е. 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 за помощь!

- = Люк

1 Ответ

0 голосов
/ 20 июля 2011

Если элементы добавляются и удаляются из вашей коллекции, а привязка настроена правильно, обновления в представлении должны быть автоматическими.

Установили ли вы точки останова в методе MoveUp, чтобы убедиться, что там что-то действительно происходит? Я хотел бы убедиться, что SelectedItem привязан правильно (вы не показываете эту привязку в вашем коде) и не является нулевым, когда к нему обращаются. Я также закомментировал бы строку, которая выполняет вставку, и убедился бы, что вызов Remove действительно вызывает правильное обновление вашего представления.

...