从 ViewModel 中移除 ListBoxItem

Remove ListBoxItem from ViewModel

我为 WindowsPhone 8.1 开发 CRUD 应用程序。我可以将数据添加到 ObservableCollection 集合,并且此数据显示在 ListBox 上。我使用 MVVM 模式。

完整存储库https://github.com/OlegZarevych/CRUD_WP81

查看:

<ListBox x:Name="Storage" ItemsSource="{Binding Path=Models, Mode=TwoWay}" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid  Height="30" Width="450">
                            <TextBlock x:Name="nameblock" Text="{Binding Name}" />
                        </Grid>
                        </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

和 ViewModel class

 public class ViewModel
    {
        public string NewName { get; set; }
        public string NewSurname { get; set; }
        public int NewAge { get; set; }
        public int i=0 ;
        public ObservableCollection<DataStorageModel> Models { get; set; }
        //Event Handlers
        public ICommand CreateClickCommand { get; set; }
        public ICommand UpdateClickCommand { get; set; }
        public ICommand DeleteClickCommand { get; set; }
        public ViewModel()
        {
            CreateClickCommand = new RelayCommand(arg => CreateClickMethod());
            UpdateClickCommand = new RelayCommand(arg => UpdateClickMethod());
            DeleteClickCommand = new RelayCommand(arg => DeleteClickMethod());

            Models = new ObservableCollection<DataStorageModel>()         {};
        }
        private void CreateClickMethod()
        {
            Models.Add(new DataStorageModel() { Name = NewName, Surname = NewSurname, Age = NewAge, Count=i++ });

        }
        private void UpdateClickMethod()
        {}
        private void DeleteClickMethod()
       {}

}

我想更改数据并删除它。据我了解,我需要 select 从 ListBoxItems 计数并在 ObservableCollection 中删除(更新)这个计数。 如何使用 ViewModel class 中的 XAML 代码? 如何在 ViewModel 中初始化存储?

或者在 MVVM 中是解决此问题的更好方法?

当您想从 ListBox 中删除一个模型时,您通常需要一些方法来识别您要删除的选定 ListBoxItems(或多个模型);为此,请考虑在您的模型上使用 IsSelected 属性 并将其绑定到 ListBoxItem 数据模板中的 CheckBox

现在,当您单击删除时,删除命令可以轻松地查看 Models 列表并查看选择要删除的项目。删除项目后,它可以枚举集合并重新计算剩余项目的计数值并更新视图模型中的字段。

因此,您无需访问 XAML 即可更新模型的数量。如果您使计数 属性 可变,那么在从列表中删除项目后就不必重新初始化存储。

我在模型中添加了代码

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

还在视图中添加了带绑定的复选框。

        <ListBox x:Name="Storage" Background="Gray" FontSize="14" ItemsSource="{Binding Path=Models, Mode=TwoWay}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid  Height="60" Width="400" >
                        <CheckBox  x:Name="checkbox" IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
                        <TextBlock x:Name="nameblock" Text="{Binding Name}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

但是当我选中项目中的复选框时,IsSelected var 没有改变 为什么?