Элементы управления входом в CollectionView не обновляют источник, к которому они привязаны (Xamarin.Forms, UWP) - PullRequest
0 голосов
/ 06 августа 2020

Я создаю образовательное приложение для изучения терминологии ... используя UWP через Xamarin.Forms для ввода данных. Это представление предназначено для создания списков терминов и сохранения их в моей базе данных. В данном случае мы составляем список костей тела. Вот как это выглядит:

My view after pressing

Pretty simple UI. Every time I click "Add New Item(s)" it creates a "<*New Item*>" Запись вверху моего CollectionView . Я заменяю «<* New Item *>» нужным словом, а затем нажимаю кнопку «Сохранить».

Кнопка «Добавить новый элемент (ы)» работает как чемпион, но кнопка «Сохранить» "кнопка больна. После первого нажатия кнопки «Сохранить» список отправляется в мою базу данных json. Когда я проверяю базу данных, я вижу «<* New Item *>» вместе с остальной частью списка, например:

  "name": "Bones of the Body, Common",
  "choiceFormat": "6x1",
  "items": [
    "<*New Item*>",
    "Ankle Bone",
    "Arm Bone",
    "Breastbone",
    "Cheek Bone",
    "Collarbone",
    "Forearm Bone (Large)",
    "Forearm Bone (Small)",
    "Hammer",
    "Hard Palate (back)",
    "Heel Bone",
    "Hip Bone",
    "Knee Cap",
    "Leg Bone (Large)",
    "Leg Bone (Small)",
    "Lower Jaw",
    "Rib",
    "Rib Cage",
    "Shoulder Blade",
    "Spine",
    "Stirrup",
    "Tailbone",
    "Thigh Bone",
    "Tongue Bone",
    "Upper Jaw"
  ],
  "spellable": true

Теперь в моем пользовательском интерфейсе я нажимаю на верхнюю запись для «<* New Item *> "и переименуйте его в" Anvil "вот так ...

My view after renaming to

Then when I click save, the database list stays the same... it still says "<*New Item*>" and not "Anvil".

So I dropped a breakpoint in the save function and the debugger's telling me that here's where the issue is... the ObservableCollection that's the source for my CollectionView (named OCItems) doesn't say "Anvil", it's stuck on "<*New Item*>". (The location of the breakpoint is noted in my ViewModel code below.)

Debugger watch showing that the Observable Collection doesn't say Anvil like it should

My other controls (Choice Format and Spellable) bind, update, and save to the database just fine. What's going on with the Entry controls in my CollectionView? Why don't they update when I replace the text in them? Note that both {Binding}s are TwoWay.

Here's the relevant code:

XAML

...

ViewModel

...
public ObservableCollection<string> OCItems { get; set; }
public ICommand AddItemSlot { get; set; }
public ICommand SaveAnswerSet { get; set; }
...

...
// (in constuctor)
AddItemSlot = new Command(() =>
{
    OCItems.Insert(0, "<*New Item*>");
});

SaveAnswerSet = new Command(() =>
{
    App.Database.Save(OCItems);   // BREAKPOINT
});
...

Спасибо за ваше внимание.

С уважением, Дэвид

1 Ответ

1 голос
/ 06 августа 2020

Элементы управления входом в CollectionView не обновляют источник, к которому они привязаны

Проблема в том, что строка не реализует интерфейс INotifyCollectionChanged, поэтому он не будет уведомлять об изменении элемента после изменения. Для этого сценария мы предлагаем создать класс для обертывания строкового типа и реализовать интерфейс INotifyCollectionChanged. И используйте ObservableCollection для замены ObservableCollection.

public class StringWrap : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string PropertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

    private string _content;
    public string Content
    {
        get
        {
            return _content;
        }
        set
        {
            _content = value;
            OnPropertyChanged();
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...