在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
的收集时间是否相同?如果是,可以如何解决?)
已编辑(已添加)
ObservableCollection以这种方式声明:
ObservableCollection<ShAvaQu> _ShAvaQuCollection =
new ObservableCollection<ShAvaQu>();
public ObservableCollection<ShAvaQu> 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();
}
}
答案 0 :(得分:2)
1)最重要的是,您不应该从Windows /窗体调用数据库逻辑。你应该把它抽象成另一个类。然后你可以让你的方法返回一个可观察的集合。
但是在您的情况下,我假设您正在尝试使用辅助表单重新加载/加载集合,并且您希望它在主表单上使用。这样做的问题是您正在创建表单的新实例,因此正在填充您的集合,但不是在主表单上而是副本。
有几种方法可以尝试解决这个问题。
1)使方法静态,将可观察集合设为静态,以便更新单个实例。
2)将主表单的实例句柄传递到辅助表单,以便重新使用已有的实例。这样做更为可取,因此您不会在整个地方创建新实例。
在第二种形式的构造函数中,您可以传入主窗口的实例,然后可以直接使用它。这应该可以解决你的问题。
更新:这是一些代码示例。基本上有很多方法可以传递引用。
您可以使用构造函数执行此操作:
// 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();
这是基础知识。这种类型的场景适用于您需要传递引用的任何场景。
希望有所帮助。