我对MVVM很陌生,所以希望这不是一个难题。
基本上我有两个观点:- 1. 保存一个数据网格,该网格显示 ObservableCollection 对象中的所有内容 2.第二个视图基本上有两个文本框,当用户在窗体上按"确定"时,这些文本框会添加到可观察集合中。
基本上,我正在做的是通过单击按钮显示第一个视图的第二个视图,按钮标记为"添加项目"
然后,我在第二个视图中输入需要添加到可观察集合的信息。当我在窗体上按确定时,它会调用一个方法"AddMProduct",该方法基本上将一个项目添加到 ViewModel 内的集合中。
但问题是通过这样做它创建了一个新的 ViewModel() 对象,因此重新初始化 ObservableCollection。因此,集合被重置回零。
那么在 MVVM 模型中,我如何基本上保留 2 个视图和 ViewModel 之间的集合?
谢谢
------------------法典---------------
视图 1
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnAddProjectGroup_Click(object sender, RoutedEventArgs e)
{
// Open new window here to add a new project group
AddProductGroup dlg = new AddProductGroup();
dlg.ShowDialog();
}
}
视图 2
ProductGroupBindable newProduct = new ProductGroupBindable();
ProductsViewModel viewModel = null;
public AddProductGroup()
{
viewModel = new ProductsViewModel();
InitializeComponent();
}
private void btnOK_Click(object sender, RoutedEventArgs e)
{
newProduct.Id = System.Guid.NewGuid();
newProduct.Name = txtName.Text;
newProduct.Description = txtDescription.Text;
viewModel.AddProduct(newProduct);
this.Close();
}
视图模型
class ProductsViewModel : INotifyPropertyChanged
{
private ObservableCollection<ProductGroupBindable> m_ProductCollection;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public ObservableCollection<ProductGroupBindable> ProductCollection
{
get
{
Test();
return m_ProductCollection;
}
set
{
m_ProductCollection = value;
}
}
private void Test()
{
m_ProductCollection.Add(new ProductGroupBindable { Description = "etc", Name = "test12" });
}
public ProductsViewModel()
{
if (m_ProductCollection == null)
ProductCollection = new ObservableCollection<ProductGroupBindable>();
}
public void AddProduct(ProductGroupBindable newProduct)
{
ProductCollection.Add(newProduct);
NotifyPropertyChanged("ProductCollection");
}
考虑这个简单的选项来解决问题。创建接受ProductsViewModel
作为参数的对话框视图的重载构造函数。这样,您可以将现有的视图模型对象从MainWindow
传递到对话框,从而避免实例化新的空视图模型:
//in MainWindow
private void btnAddProjectGroup_Click(object sender, RoutedEventArgs e)
{
//Open new window here to add a new project group
AddProductGroup dlg = new AddProductGroup(this.viewmodel);
dlg.ShowDialog();
}
//in AddProductGroup :
public AddProductGroup(ProductsViewModel vm)
{
viewModel = vm;
InitializeComponent();
}