使用ListView和ObservableCollection的正确方法

时间:2015-05-19 11:47:25

标签: c# wpf listview observablecollection

我使用ListView和items绑定为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");
            }
        }

所以我对它有疑问:

  • 在每个get中使用SqlConnection是否正确?
  • 我是否应该使用一个SqlConnection并在不打开新的情况下使用它 每次?
  • 为什么当我在ListView中选择项目时,它会随时获取 (有时甚至20倍到相同的?),例如它去 productCount,然后到productPrice,然后再次计数等?我知道 那,如果值!= null那么它只会返回上一个(私有) 价值,但也许我做错了什么

非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:3)

Noooooooooooooooooooo!

不要在你的吸气剂中打开SQLConnections

更好的方法是只在需要时设置NamePar属性。

这是我的意思的一个例子:

为您的商品创建一个类,如下所示:

public class MyItem
{
    public string Name { get; set; }

    ...
}

创建项目列表的任何人都有责任填充其属性值。因此,您需要创建一个刷新列表的方法。例如:

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连接内容移动到视图模型,您已经获得了一些性能,因为您不再在属性获取者中运行查询。