gpt4 book ai didi

wpf - ObservableCollection获取重置(项目计数为0)在两个 View 之间

转载 作者:行者123 更新时间:2023-12-03 10:37:16 28 4
gpt4 key购买 nike

我对MVVM非常陌生,因此希望这不是一个难题。

基本上我有两种观点:
1.拥有一个数据网格,其中显示了ObservableCollection对象内的所有内容
2.第二个 View 基本上有两个文本框,当用户在表单上按OK时,这两个文本框会添加到ObservableCollection中。

基本上,我正在做的是从第一个 View 显示第二个 View ,并单击按钮,按钮标记为“添加项目”

然后,在第二个 View 中输入需要添加到ObservableCollection的信息。当我在窗体上按OK时,它将调用方法“AddMProduct”,该方法基本上将一个项目添加到ViewModel内部的集合中。

但是问题在于这样做会创建一个新的ViewModel()对象,因此要重新初始化ObservableCollection。因此,集合将重置为零。

因此,在MVVM模型中,我如何基本上保留2个 View 与ViewModel之间的集合?

谢谢

- - - - - - - - - 代码 - - - - - - - -

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

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

View 模型
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作为参数的对话框 View 的重载构造函数。这样,您可以将现有的viewmodel对象从MainWindow传递到对话框,从而避免实例化新的空viewmodel:

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

关于wpf - ObservableCollection获取重置(项目计数为0)在两个 View 之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22881249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com