【问题标题】:Delete duplicate rows in datagrid Wpf MVVM?删除datagrid Wpf MVVM中的重复行?
【发布时间】:2019-11-13 20:57:44
【问题描述】:

当我从 TextBox 添加新元素时,我试图删除 DataGrid 中的重复元素。 也许,有人知道如何解决它吗?

public class ShellViewModel : Screen
{
   private string _input = string.Empty;
    public ObservableCollection<Person> people;

    public ShellViewModel()
    {

    }

    public string Input
    {
        get
        {
            return _input;
        }
        set
        {
            _input = value;
            NotifyOfPropertyChange(() => Input);
        }
    }       

    public ObservableCollection<Person> People
    {
        get
        {
            return people;
        }
        set
        {
            people = value;
            NotifyOfPropertyChange(() => People);
        }
    }

    Person person = new Person();
    ObservableCollection<Person> persons = new ObservableCollection<Person>();
    public void Write()
    {
         person.name = Input;
         persons.Add(person);         
         People = persons;                     
    }
   }

我在向 DataGrid 添加元素时没有任何问题,但我不知道如何删除重复的元素。 提前谢谢你。

【问题讨论】:

    标签: c# wpf mvvm datagrid caliburn.micro


    【解决方案1】:

    在将Person 添加到集合之前你必须检查它是否已经存在。

    我还修复了您的代码的一些问题。由于PeopleObservableCollection,您可以直接向其中添加项目,视图将注册集合中的更改并立即更新。
    您还应该在将Person 添加到集合时创建一个新实例,否则您将覆盖现有的实例。您当前使用的是单个 Person。字段应始终private

    public class ShellViewModel : Screen
    { 
        public void ShellViewModel()
        {
          this.Input = string.Empty;
          this.People = new ObservableCollection<People>();      
        }
    
        private string _input = string.Empty;
        public string Input
        {
            get => _input;
            set
            {
                _input = value;
                NotifyOfPropertyChange(() => Input);
            }
        }       
    
        private ObservableCollection<Person> people;
        public ObservableCollection<Person> People
        {
            get => people;
            set
            {
                people = value;
                NotifyOfPropertyChange(() => People);
            }
        }
    
        public void Write()
        {
          if (string.IsNullOrWhiteSpace(this.input) 
            || this.People.Any(person => person.name.Equals(this.Input, StringComparison.OrdinalIgnoreCase))
          {
            return;
          }
    
          Person newPerson = new Person() {name = this.Input};
          this.People.Add(newPerson);      
       }
    }
    

    【讨论】:

    • 当我使用“if (this.People.Any(person => person.name.Equals(this.Input, StringComparison.OrdinalIgnoreCase)) { return; }”时出现 System.ArgumentNullException 跨度>
    • 你需要初始化你的属性。我跳过它,因为我认为这应该很清楚。我更新了代码。
    【解决方案2】:

    您可以避免添加重复记录

        public void Write()
        {
            person.name = Input;
            if (!persons.Contains(person))
                persons.Add(person);
            People = persons;
        }
    

    【讨论】:

    • 它有效,仅适用于第一个元素。当我向 DataGrid 输入第二个元素时,DataGrid 不显示其他元素,除了第一个
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2016-08-20
    • 2011-04-08
    • 2023-03-24
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多