可观察集合在 2 个视图之间重置(项目计数 0)



我对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();
}

相关内容

  • 没有找到相关文章

最新更新