在mvvm应用程序中修改集合中的一个属性时,如何持久化数据

本文关键字:属性 一个 数据 持久化 修改 应用程序 mvvm 集合 | 更新日期: 2024-09-25 11:40:23

我的mvvm应用中有以下模型

public class Student: INotifyPropertyChanged
{
 private string _name;
 public string Name 
 { 
    get
    {
        return _name;
    }
    set
    {
        _name = value;
        OnPropertyChanged("Name"); 
    }
 }
 private bool _isSelected;
 public bool IsSelected 
 {
    get
    {
        return _isSelected;
    } 
    set
    {
        _isSelected = value;
        OnPropertyChanged("IsSelected");
    }
}
}

我有以下视图模型

public class StudentViewModel : INotifyPropertyChanged
 {
  private ObservableCollection<Student> _students;
  public ObservableCollection<Student> Students
   {
     get 
     {
         return utilslib.Getstudents();
     }
     set
     {
         _students = value;
         OnPropertyChanged("Students");
     }
  }
 }

我有以下列表,我将与学生收藏绑定。

    <<Button Command="{Binding DeleteSelectedStudentsCommand}" Name="buttontodeletestudents" content ="Delete"/>
     <ListBox Name="studentslist" ItemsSource="{Binding Students}" Margin="0,0,10,10" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox Name="hobbycheck" Content="{Binding Path=Name}"
                              IsChecked="{Binding IsSelected,ModeTwoWay}" />

                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

在视图模型中,当用户单击按钮"Delete"时,我实现了icommand DeleteSelectedStudentsCommand。我想删除IsSelected设置为true的记录,并使用下面的语句进行删除。

 var students = Students.Where( s => s.IsSelected);

当复选框被选中时,我会在Model类中触发ischecked事件。但当用户单击"删除"按钮时,我看不到任何选中复选框的记录将isselected设置为true。如何在集合中保持IsSelected属性的值?

在mvvm应用程序中修改集合中的一个属性时,如何持久化数据

我的猜测是,每次调用Students时,getter都会给您新的集合,这就是为什么IsSelected属性似乎没有持久化的原因。您在一个集合中设置了Student的IsSelected属性,并在其他集合中检查了相同的属性。

这可以通过检查utilslib来确认。获取学生()。这种方法能做什么?它真的每次调用都返回不同的ObservableCollection吗?

下面更新的代码已经修复了这个问题。

 private ObservableCollection<Student> _students;
 public ObservableCollection<Student> Students
  {
    get 
    {
   if(_students==null)
     return utilslib.Getstudents();
   else
    return _students
 }
 set
 {
     _students = value;
     OnPropertyChanged("Students");
 }

}