xamarin.forms - 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 代码中注明。)
我的其他控件(选择格式和拼写)很好地绑定、更新和保存到数据库。我的 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
});
...
感谢您的考虑。
亲切的问候,大卫
解决方案
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();
}
}
}
推荐阅读
- python - 删除短输入功能中的冗余行
- uwp - MSIX 打包工具:从 x86 到 x64 的应用
- python - 在 multiprocessing.Pool.apply_async 函数中使用 multiprocessing.Pipe() 时发生死锁
- html - 如何在具有溢出滚动的父项中包含子元素的边距?
- android - 获取“未找到证书路径的信任锚”。对于曾经有效的服务
- java - 查询失败,错误代码 13 和服务器 localhost:27017 上的错误消息“命令查找需要身份验证”
- r - 如何在 NMDS 任命中添加新点?
- rust - 难以聚合匹配 |
- http - 为什么 ASP.NET Core 路由会导致 Azure 上的 HEAD 请求异常?
- php - 将 PDO 连接到 Sql Server