从另一个窗口(Class)问题调用方法

在WPF应用程序主窗口的代码隐藏文件中,我有一个方法,使用LINQ to SQL查询数据库并将结果写入ObservableCollection:

public void GetStateByDate(string shcode) { MydbDataContext contextSts = new MydbDataContext(); _ShAvaQuCollection.Clear(); var sts = from p in contextSts.SAties where p.ShID == shcode select p; foreach (var p in sts) _ShAvaQuCollection.Add(new ShAvaQu { ShCode = p.ShID, SiID = p.SiID, PrCat = p.PrCat }); } 

当我从文件后面的相同代码(同一窗口)调用此方法时,一切正常。

如果我从另一个窗口调用此方法,使用主窗口的instanse,ObservableCollection仍为空:

 SWindow sw = new SWindow(); sw.GetStateByDate(stringpar); 

这是什么原因? 在这种情况下,方法是否创建了另一个ObservableCollection实例?

(我可以在调试器中看到sw._ShAvaQuCollection包含值sw._ShAvaQuCollection与_ShAvaQuCollection的集合_ShAvaQuCollection吗?如果是,它是如何解决的?)

编辑(已添加)

ObservableCollection以这种方式声明:

  ObservableCollection _ShAvaQuCollection = new ObservableCollection(); public ObservableCollection ShAvaQuCollection { get { return _ShAvaQuCollection; } } public class ShAvaQu { public string ShCode { get; set; } public string SiID { get; set; } public int PrCat { get; set; } } 

我从一个窗口调用该方法,其中另一个集合ShQuCollection通过ListView显示。 在SelectionChanged事件处理程序中,我为此数据库查询获取一个参数:

 private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) { SWindow sw = new SWindow(); string str = sw.ShQuCollection[ShSelList.SelectedIndex].ShCode; sw.GetStateByDate(str); Close(); } } 

1)最重要的是,你不应该从你的窗口/窗体调用数据库逻辑。 你应该把它抽象成另一个类。 然后你可以让你的方法返回一个可观察的集合。

但是在您的情况下,我假设您正在尝试使用辅助表单重新加载/加载集合,并且您希望它在主表单上使用。 这样做的问题是您正在创建表单的新实例,因此您的集合正在填充但不在主表单上而是副本。

有几种方法可以尝试解决这个问题。

1)使方法静态,并使可观察集合静态,以便更新单个实例。

2)将主表单的实例句柄传递到辅助表单,以便重新使用已有的实例。 这样会更好,这样您就不会在整个地方创建新实例。

在第二种forms的构造函数中,您可以传入主窗口的实例,然后可以直接使用它。 这应该可以解决您的问题。

更新:这是一些代码示例。 基本上有很多方法可以传递引用。

您可以使用构造函数执行此操作:

 // This is the constructor for your second window private Window _parentHandle; public SecondWindow(Window obj) { this._parentHandle = obj; } 

然后从具有该方法的主窗体开始,就像这样打开该窗口。

 SecondWindow w = new SecondWindow(this); w.Show(); 

现在,您的第二个窗口可以直接处理第一个窗口,因此您可以在该变量上调用方法,它将更新。

另一种方法是在第二个窗口上使用公共Setter方法。

 public Window ParentContext { get { return this._parentHandle; } set { this._parentHandle = value; } } 

然后你可以像这样创建你的表单实例:

 SecondWindow w = new SecondWindow(); // so just like normal w.ParentContext = this; // set the instance to the calling form w.Show(); 

这是基础知识。 这种类型的场景适用于您需要传递引用的任何场景。

希望有所帮助。