ObservableCollection 位于 ObservableCollection 内部,在现有 ObservableCollection 中输入新项目

问题描述 投票:0回答:1

我在模型方面拥有 2 类专利和作者。类 Patent 有可观察的集合 PatentAuthors,它存储专利的所有作者,其中可能有多个。

public class Patent
{
    public int Id {get; set;}
    public string Number {get; set;}
    public string Name {get; set;}
    public ObservableCollection<Author> PatentAuthors {get; set;}
    public string Description {get; set;}

    public Patent()
    {

    }
}
public class Author
{
    public int Id {get; set;}
    public string FullName {get; set;}
    public string Adres {get; set;}
    public string PhoneNumber {get; set;}

    public Author()
    {

    }
}

还在模型中,我有一个 PatentManager 类,在其中创建一个可观察的专利集合,并在其中存储所有专利和可观察的作者集合。

public static ObservableCollection<Patent> _DataBasePatent = new()
{
    
}


public static ObservableCollection<Patent> GetPatents()
{
    return _DataBasePatent;
}

public static void AddPatent(Patent patent)
{
    _DataBasePatent.Add(patent);
}

在 ViewModel 中,我有类 AddPatentViewModel,它具有添加新专利的命令,并且只有 1 位专利作者可观察集合 _DataBasePatent,该命令绑定到按钮。

public class AddPatentViewModel
{
    public ICommand AddPatentCommand {get;set;}
    public string AddNumber {get;set;}
    public string AddName {get;set;}
    public string AuthorFullName {get;set;}


    public AddPatentViewModel()
    {
        AddPatentCommand = new RelayCommand(AddPatent, canAddPatent);
    {

    public bool canAddPatent(object obj)
    {
        return true;
    }

    public void AddPatent(object obj)
    {
        PatentManager.AddPatent(new()
            {
                Number = AddNumber, 
                Name = AddName,
                PatentAuthors = new ()
                    {
                        FullName = AuthorFullName
                    } 
            });
    }
}

那么,我的问题是,如果我想向现有专利添加新作者怎么办?另外,我在 ViewModelBase 中有一个方法 SelectedPatent,它返回 listview itemsource 中单击专利的值,它可以帮助我查看单击专利的所有信息。

我尝试使用命令 AddNewAuthorToOldPatentCommand 编写一个新类 AddAuthorToOldPatent

public class AddPatentViewModel : ViewModelBase
{
    public ICommand AddNewAuthorToOldPatentCommand {get;set;}
    public string AuthorFullName {get;set;}


    public AddPatentViewModel()
    {
        AddNewAuthorToOldPatentCommand= new RelayCommand(AddNewAuthorToNewPatent, canAddNewAuthorToNewPatent);
    {

    public bool canAddNewAuthorToNewPatent(object obj)
    {
        return true;
    }

    public void AddNewAuthorToNewPatent(object obj)
    {
        Patent patent = new Patent();
        var found = patent.FirstOrDefault(SelectedPatent);
        found.PatentAuthors.Add(new(){FullName = AuthorFullName});
        
    }
}

但这不起作用。我是 C# 和 mvvm 模式的新手。

c# wpf mvvm observablecollection
1个回答
0
投票

您可能想要创建一个

PatentView
并将其
DataContext
绑定到
SelectedPatent
属性。即

<PatentView DataContext="{Binding SelectedPatent}"/>

您可能还应该决定创建

PatentViewModel
AuthorViewModel
,或者让现有的
Patent
Author
类实现
INofityPropertyChanged
。使用不同的模型和视图模型类是推荐的方法,但它确实需要更多代码。要点是视图访问的每个类都应该实现
INotifyPropertyChanged
[*],否则更改将无法正确传播到 UI。

然后,您可以将按钮添加到您的

PatentView
,绑定到
AddNewAuthorCommand
PatentViewModel
类上相应的
Patent

[*] 可能会有一些例外,但建议始终实现 INotifyPropertyChanged 或等效接口。

© www.soinside.com 2019 - 2024. All rights reserved.