我在模型方面拥有 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 模式的新手。
您可能想要创建一个
PatentView
并将其 DataContext
绑定到 SelectedPatent
属性。即
<PatentView DataContext="{Binding SelectedPatent}"/>
您可能还应该决定创建
PatentViewModel
和 AuthorViewModel
,或者让现有的 Patent
和 Author
类实现 INofityPropertyChanged
。使用不同的模型和视图模型类是推荐的方法,但它确实需要更多代码。要点是视图访问的每个类都应该实现 INotifyPropertyChanged
[*],否则更改将无法正确传播到 UI。
然后,您可以将按钮添加到您的
PatentView
,绑定到 AddNewAuthorCommand
或 PatentViewModel
类上相应的 Patent
。
[*] 可能会有一些例外,但建议始终实现 INotifyPropertyChanged 或等效接口。