MVVM模式下ListView绑定的Entry内容点击保存按钮时如何存入类
解决方案
核心逻辑说明
ListView的ItemTemplate是复用模板,模板内定义的x:Name作用域仅限模板内部,后台代码无法直接通过名称获取所有列表项的Entry实例。MVVM模式下的标准解法是通过绑定把输入内容同步到数据源的临时属性中,点击保存时统一读取数据源处理,不会在输入过程中触发持久化存储,完全匹配需求。
具体实现步骤
1. 修改列表对应的Model类
你的JJ集合绑定的每个元素所属的类,需要新增两个临时存储输入内容的属性,同时实现INotifyPropertyChanged接口保证双向绑定生效,示例代码如下:
public class JJItem : INotifyPropertyChanged { // 原有字段 private string _name; public string name { get => _name; set { _name = value; OnPropertyChanged(); } } // 新增临时存储输入内容的属性,仅存在内存中,不会提前持久化 private string _entry1Temp; public string Entry1Temp { get => _entry1Temp; set { _entry1Temp = value; OnPropertyChanged(); } } private string _entry2Temp; public string Entry2Temp { get => _entry2Temp; set { _entry2Temp = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 修改XAML代码,给Entry添加双向绑定
将两个Entry的Text属性绑定到新增的临时属性上,不需要保留x:Name:
<ListView ItemsSource="{Binding JJ}"> <ListView.ItemTemplate> <DataTemplate> <Grid> <Label Grid.Row="0" Grid.Column="0" Text="{Binding name}"/> <Entry Grid.Row="0" Grid.Column="1" Text="{Binding Entry1Temp, Mode=TwoWay}"/> <Entry Grid.Row="0" Grid.Column="2" Text="{Binding Entry2Temp, Mode=TwoWay}"/> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button Text="save" Clicked="Button_Clicked"/>
3. 编写保存按钮点击逻辑
点击按钮时直接遍历JJ集合就能拿到所有Entry的输入内容,统一执行持久化存储即可:
private void Button_Clicked(object sender, EventArgs e) { // 此处JJ为绑定的ObservableCollection<JJItem>类型集合 foreach (var item in JJ) { var currentItemName = item.name; var entry1Input = item.Entry1Temp; var entry2Input = item.Entry2Temp; // 在此处写你的批量存储逻辑,比如写入数据库、本地文件等 } // 存储完成后可按需清空临时属性,避免下次打开重复提交 }
内容的提问来源于stack exchange,提问作者Behzad Changizi
相关产品推荐
相关产品推荐

