C# 使用ListView和ObservableCollection的正确方法
我正在使用ListView,将项绑定为ObservableCollection。每个对象都有自己的get、set,例如:C# 使用ListView和ObservableCollection的正确方法,c#,wpf,listview,observablecollection,C#,Wpf,Listview,Observablecollection,我正在使用ListView,将项绑定为ObservableCollection。每个对象都有自己的get、set,例如: public string NamePar { get { if (_namePar == null) { if (_productID > 0) {
public string NamePar
{
get
{
if (_namePar == null)
{
if (_productID > 0)
{
using (SqlConnection conn = new SqlConnection(cString.c_String))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("...", conn))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
_namePar = rdr[0].ToString();
}
}
}
}
}
}
return _namePar;
}
set
{
if (_namePar == value)
return;
_namePar = value;
NotifyPropertyChanged("NamePar");
}
}
public void Refresh()
{
//Open a SQL Connection
//Get the records you need
//Populate an observable collection of [MyItem] with the records from the database.
}
所以我有个问题:
- 在每次get中使用SqlConnection是否正确
- 我是否应该使用一个SqlConnection并在不打开新连接的情况下使用它 每一次
- 为什么每次我在ListView中选择项时,它都会得到 (有时甚至要20倍才能得到相同的结果?),例如 productCount,然后是productPrice,然后再次计数,等等?我知道 那,如果值的话!=空,则它将只返回上一个(私有) 价值,但也许我做错了什么
SQLConnections
更好的方法是只在需要时设置NamePar
属性
这里有一个例子来说明我的意思:
为项目创建一个类,如下所示:
public class MyItem
{
public string Name { get; set; }
...
}
创建项目列表以填充其属性值的人有责任。因此,您需要创建一个刷新列表的方法。例如:
public string NamePar
{
get
{
if (_namePar == null)
{
if (_productID > 0)
{
using (SqlConnection conn = new SqlConnection(cString.c_String))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("...", conn))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
_namePar = rdr[0].ToString();
}
}
}
}
}
}
return _namePar;
}
set
{
if (_namePar == value)
return;
_namePar = value;
NotifyPropertyChanged("NamePar");
}
}
public void Refresh()
{
//Open a SQL Connection
//Get the records you need
//Populate an observable collection of [MyItem] with the records from the database.
}
通过将SQL连接内容移到食物链的更高层,到视图模型,您已经获得了一些性能,因为您不再在属性获取程序中运行查询。nooooooooo
不要在getter中打开SQLConnections
更好的方法是只在需要时设置NamePar
属性
这里有一个例子来说明我的意思:
为项目创建一个类,如下所示:
public class MyItem
{
public string Name { get; set; }
...
}
创建项目列表以填充其属性值的人有责任。因此,您需要创建一个刷新列表的方法。例如:
public string NamePar
{
get
{
if (_namePar == null)
{
if (_productID > 0)
{
using (SqlConnection conn = new SqlConnection(cString.c_String))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("...", conn))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
_namePar = rdr[0].ToString();
}
}
}
}
}
}
return _namePar;
}
set
{
if (_namePar == value)
return;
_namePar = value;
NotifyPropertyChanged("NamePar");
}
}
public void Refresh()
{
//Open a SQL Connection
//Get the records you need
//Populate an observable collection of [MyItem] with the records from the database.
}
通过将SQL连接内容移到食物链的更高层,到视图模型,您已经获得了一些性能,因为您不再在属性获取程序中运行查询。nooooooooo
不要在getter中打开SQLConnections
更好的方法是只在需要时设置NamePar
属性
这里有一个例子来说明我的意思:
为项目创建一个类,如下所示:
public class MyItem
{
public string Name { get; set; }
...
}
创建项目列表以填充其属性值的人有责任。因此,您需要创建一个刷新列表的方法。例如:
public string NamePar
{
get
{
if (_namePar == null)
{
if (_productID > 0)
{
using (SqlConnection conn = new SqlConnection(cString.c_String))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("...", conn))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
_namePar = rdr[0].ToString();
}
}
}
}
}
}
return _namePar;
}
set
{
if (_namePar == value)
return;
_namePar = value;
NotifyPropertyChanged("NamePar");
}
}
public void Refresh()
{
//Open a SQL Connection
//Get the records you need
//Populate an observable collection of [MyItem] with the records from the database.
}
通过将SQL连接内容移到食物链的更高层,到视图模型,您已经获得了一些性能,因为您不再在属性获取程序中运行查询。nooooooooo
不要在getter中打开SQLConnections
更好的方法是只在需要时设置NamePar
属性
这里有一个例子来说明我的意思:
为项目创建一个类,如下所示:
public class MyItem
{
public string Name { get; set; }
...
}
创建项目列表以填充其属性值的人有责任。因此,您需要创建一个刷新列表的方法。例如:
public string NamePar
{
get
{
if (_namePar == null)
{
if (_productID > 0)
{
using (SqlConnection conn = new SqlConnection(cString.c_String))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("...", conn))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
_namePar = rdr[0].ToString();
}
}
}
}
}
}
return _namePar;
}
set
{
if (_namePar == value)
return;
_namePar = value;
NotifyPropertyChanged("NamePar");
}
}
public void Refresh()
{
//Open a SQL Connection
//Get the records you need
//Populate an observable collection of [MyItem] with the records from the database.
}
通过将SQL连接内容移到食物链的更高层,即视图模型,您已经获得了一些性能,因为您不再在属性getter中运行查询。对于性能,根据您的环境,您不应该在每次获取时都打开SQL连接。您可以使用构造函数一次读取数据库中的所有值。在此之后,如果需要刷新,您可以调用更新所有属性的相同方法。好的,谢谢。但是,即使在listview中选择了changed之后,有没有办法不输入每个“get”呢?我对observablecollections做得不多,但我想wpf会检查每次单击或更改listview时该值是否都发生了更改。这导致了对getter的调用…为了提高性能,根据您的环境,您不应该在每个get上打开SQL连接。您可以使用构造函数一次读取数据库中的所有值。在此之后,如果需要刷新,您可以调用更新所有属性的相同方法。好的,谢谢。但是,即使在listview中选择了changed之后,有没有办法不输入每个“get”呢?我对observablecollections做得不多,但我想wpf会检查每次单击或更改listview时该值是否都发生了更改。这导致了对getter的调用…为了提高性能,根据您的环境,您不应该在每个get上打开SQL连接。您可以使用构造函数一次读取数据库中的所有值。在此之后,如果需要刷新,您可以调用更新所有属性的相同方法。好的,谢谢。但是,即使在listview中选择了changed之后,有没有办法不输入每个“get”呢?我对observablecollections做得不多,但我想wpf会检查每次单击或更改listview时该值是否都发生了更改。这导致了对getter的调用…为了提高性能,根据您的环境,您不应该在每个get上打开SQL连接。您可以使用构造函数一次读取数据库中的所有值。在此之后,如果需要刷新,您可以调用更新所有属性的相同方法。好的,谢谢。但是,即使在listview中选择了changed之后,有没有办法不输入每个“get”呢?我对observablecollections做得不多,但我想wpf会检查每次单击或更改listview时该值是否都发生了更改。这导致了对getter的调用。。。