首页 > 解决方案 > CollectionView 中的条目控件不会更新它们绑定到的源(Xamarin.Forms,UWP)

问题描述

我正在创建一个用于学习术语的教育应用程序...通过 Xamarin.Forms 使用 UWP 进行数据输入。此视图用于创建术语列表并将它们保存到我的数据库中。在这种情况下,我们正在为身体的骨骼制作一个列表。这是它的样子:

按下后我的看法

很简单的用户界面。每次我单击“添加新项目”时,它都会在我的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

现在在我的 UI 中,我单击“<*New Item*>”的顶部条目并将其重命名为“Anvil”,如下所示......

我重命名后的看法

然后当我点击保存时,数据库列表保持不变......它仍然显示“<*New Item*>”而不是“Anvil”。

所以我在保存函数中放了一个断点,调试器告诉我问题出在哪里......作为我的 CollectionView(名为 OCItems)的来源的 ObservableCollection 没有说“Anvil”,它卡在“<*New项目*>”。(断点的位置在下面的 ViewModel 代码中注明。)

调试器观察显示 Observable Collection 并没有像它应该的那样说 Anvil

我的其他控件(选择格式和拼写)很好地绑定、更新和保存到数据库。我的 CollectionView 中的 Entry 控件是怎么回事?当我替换其中的文本时,为什么它们不更新?请注意,两个 {Binding} 都是双向的。

以下是相关代码:

XAML

...
<Button Text="Add New Item(s)" Grid.Row="2" Grid.Column="0" Command="{Binding AddItemSlot}" /><Button Text="Save" Grid.Row="2" Grid.Column="2" Command="{Binding SaveAnswerSet}" />
<CollectionView x:Name="MyCollectionView" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" ItemsSource="{Binding OCItems, Mode=TwoWay}" >
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <Entry Text="{Binding Mode=TwoWay}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>
...

视图模型

...
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
});
...

感谢您的考虑。

亲切的问候,大卫

标签: xamarin.formsuwp

解决方案


CollectionView 中的条目控件不会更新它们绑定到的源

问题是string没有实现INotifyCollectionChanged接口,所以修改后不会通知item的变化。对于这种情况,我们建议创建一个类来包装字符串类型并实现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();
        }

    }

}

推荐阅读