【问题标题】:Right way to use ListView and ObservableCollection使用 ListView 和 ObservableCollection 的正确方法
【发布时间】:2015-05-19 11:47:24
【问题描述】:

我正在使用 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");
            }
        }

所以我对此有疑问:

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

非常感谢您的帮助! :)

【问题讨论】:

  • 为了性能,根据您的环境,您不应在每次获取时都打开 SQL 连接。您可以使用构造函数一次从数据库中读取所有值。在此之后,如果您需要刷新它,您可以调用更新所有属性的相同方法。
  • 好的,谢谢。但是有没有什么办法不输入每个“get”,即使在 listview 中的 selectionchanged 之后?
  • 我对 observablecollections 做的不多,但我猜 wpf 会在您每次单击或更改列表视图时检查值是否已更改。这导致了对 getter 的调用...

标签: c# wpf listview observablecollection


【解决方案1】:

不啊啊啊啊啊啊啊!

不要在你的吸气剂中打开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 连接的东西移到食物链的更高层,到视图模型,您已经获得了一些性能,因为您不再在属性 getter 中运行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多