使用MVVM从ObservableCollection中删除SelecteDItem



我想在粘附到MVVM时从ObservableCollection中删除项目。我了解任务,我认为我非常了解逻辑并实施了它,但是在视图中从未删除该项目。

我已经用断点追踪了该应用程序,并且正确读取了选定项目的值。我还添加了变量,以检查删除语句之前和之后的收集大小,这是相同的值,因此它不会删除该项目。我的问题是为什么?我错过了什么?我没有遵守哪些规则?.net的新手。

**我正在使用WCF服务,以返回我的CodeFirst DB的项目的观察力,这在用户打开项目视图后立即调用。

查看

<ListBox ItemsSource="{Binding ProjectList, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedProject}" SelectedIndex="{Binding ProjectIndex}" BorderThickness="0" Margin="60,195,218.8,212.4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ProjectName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Command="{Binding DeleteCommand}" Content="Up" HorizontalAlignment="Left" Margin="563,195,0,0" VerticalAlignment="Top" Height="35" Width="75"/>

ViewModel

private ObservableCollection<Project> _projectList;
public ObservableCollection<Project> ProjectList
    {
        get 
        {
            var q = client.ReturnProjects().ToList();
            _projectList = new ObservableCollection<Project>(q.ToList());
            return _projectList;
        }
        set
        {
            _projectList = value;
            OnPropertyChanged("ProjectList");
        }
public int SelectedProject
    {
        get { return _selectedProject; }
        set
        {
            _selectedProject = value;
            OnPropertyChanged("SelectedProject");
        }
    }

命令执行的方法如下,命令正在命中,并称为方法。

public void DeleteProject()
        {
            if (SelectedProject != null)
            {
                ProjectList.Remove(SelectedProject);
            }
        } 

您需要对SelectedItem属性的双向绑定。

查看

    <ListBox ItemsSource="{Binding ProjectList}"
             SelectedItem="{Binding SelectedProject, Mode=TwoWay}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Command="{Binding DeleteCommand}"
            Content="Delete"
            HorizontalAlignment="Right"
            VerticalAlignment="Bottom" />

ViewModel,模型和ICommand实现

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        var q = new[] { new Project() { Name = "A" }, new Project() { Name = "B" }, new Project() { Name = "C" } };
        ProjectList = new ObservableCollection<Project>(q);
    }
    private ObservableCollection<Project> _projectList;
    public ObservableCollection<Project> ProjectList
    {
        get
        {
            return _projectList;
        }
        set
        {
            _projectList = value;
            OnPropertyChanged("ProjectList");
        }
    }
    Project _selectedProject;
    public Project SelectedProject
    {
        get { return _selectedProject; }
        set
        {
            _selectedProject = value;
            OnPropertyChanged("SelectedProject");
        }
    }
    public ICommand DeleteCommand => new SimpleCommand(DeleteProject);
    private void DeleteProject()
    {
        if (SelectedProject != null)
        {
            ProjectList.Remove(SelectedProject);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class Project
{
    public string Name { get; set; }
}
public class SimpleCommand : ICommand
{
    Action _execute;
    public SimpleCommand(Action execute)
    {
        this._execute = execute;
    }
    public event EventHandler CanExecuteChanged;
    public bool CanExecute(object parameter) => true;
    public void Execute(object parameter)
    {
        _execute();
    }
}

我认为删除项目以提高通知以更新视图后,需要调用OnPropertyChanged(" ProjectList")。

观测值必须与模型层相互作用。也许您需要这个:https://blogs.msdn.microsoft.com/bethmassi/2009/05/08/usise-the-wpf-observablecollection-with-ef-entities/

最新更新