Событие INotifyPropertyChanged PropertyChangedEventHandler всегда равно нулю - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь взять в руки WPF, и при обновлении я столкнулся с небольшой проблемой, в основном из-за того, что отображаются старые данные, а новые данные корректно обновляются в файле XML.Я реализовал INotifyPropertyChanged следующим образом: -

public class Products : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string _prodId;
    public string ProdID
    {
        get { return _prodId; }
        set
        {
            _prodId = value;
            OnPropertyChanged("ProdID");
        }
    }

    private string _prodName;
    public string ProdName
    {
        get { return _prodName; }
        set
        {
            _prodName = value;
            OnPropertyChanged("ProdName");
        }
    }

    private string _prodPrice;
    public string ProdPrice
    {
        get { return _prodPrice; }
        set
        {
            _prodPrice = value;
            OnPropertyChanged("ProdPrice");
        }
    }


    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

, а затем обновление выглядит следующим образом: -

        foreach (XmlNode node in nodeList)
        {
            if (nodeList[i].ChildNodes[0].InnerText == strID)
            {
                Products products = new Products();
                products.ProdName = strName;
                products.ProdPrice = strPrice;
                nodeList[i].ChildNodes[1].InnerText = strName;
                nodeList[i].ChildNodes[2].InnerText = strPrice;
                break;
            }
            i++;
        }

XML сохраняется правильно с новыми ProdName и Price, однако, когдаПосле обновления я отображаю listView, но все равно получаю неправильные значения.

Я связываю Продукты следующим образом: -

    public static List<Products> LoadProduct()
    {
        string fileName = "Products.xml";
        List<Products> ListProdRecords = new List<Products>();
        // Execute the query using the LINQ to XML
        var prods = from p in XElement.Load(fileName).Elements("Product") select p;
        foreach (var product in prods)
        {
            Products lProduct = new Products
            {
                ProdID = product.Element("ProductId").Value,
                ProdName = product.Element("ProductName").Value,
                ProdPrice = product.Element("Price").Value
            };

            ListProdRecords.Add(lProduct);
        }
        return ListProdRecords.ToList();
    }

вот код привязки: -

    private void LoadProducts()
    {
        List<Products> productList = new List<Products>();
        productList = ProductDAL.LoadProduct();
        listView1.DataContext = productList;
    }

public static void UpdateProduct (строка strID, строка strName, строка strPrice) {string fileName = "Products.xml";

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(fileName);

        XmlNodeList nodeList = xmlDoc.SelectNodes("/Products/Product");
        int i = 0;
        foreach (XmlNode node in nodeList)
        {
            if (nodeList[i].ChildNodes[0].InnerText == strID)
            {
                Products products = new Products();
                products.ProdName = strName;
                products.ProdPrice = strPrice;
                nodeList[i].ChildNodes[1].InnerText = strName;
                nodeList[i].ChildNodes[2].InnerText = strPrice;
                break;
            }
            i++;
        }

Любая помощь в том, что не так?

Спасибо за вашу помощь и время

1 Ответ

1 голос
/ 24 марта 2011

Я действительно не вижу, какое отношение новые продукты в вашем цикле имеют к listView.Вы не добавляете их в список и не добавляете их в listView другим способом.
Или другими словами: создание этих экземпляров внутри цикла абсолютно бесполезно и будет удалено оптимизатором.
Вам необходимо обновить экземпляры класса Products, которые находятся в списке, который вы привязали к listView.

...