C# 使用ListView和ObservableCollection的正确方法

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) {

我正在使用ListView,将项绑定为ObservableCollection。每个对象都有自己的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.
}
所以我有个问题:

  • 在每次get中使用SqlConnection是否正确
  • 我是否应该使用一个SqlConnection并在不打开新连接的情况下使用它 每一次
  • 为什么每次我在ListView中选择项时,它都会得到 (有时甚至要20倍才能得到相同的结果?),例如 productCount,然后是productPrice,然后再次计数,等等?我知道 那,如果值的话!=空,则它将只返回上一个(私有) 价值,但也许我做错了什么
非常感谢您的帮助!:)

不要在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连接内容移到食物链的更高层,到视图模型,您已经获得了一些性能,因为您不再在属性获取程序中运行查询。

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的调用。。。