WPF-如何更新列表列表项的更改

WPF- How to update the changes in list item of a list

我已经更新了一个 list.The 项目的列表项目在源即数据库中成功更新,但是列表没有更新 item.I 已经为列表项目使用了 INotifyPropertyChanged 接口并且该列表绑定到一个可观察的集合。

    private tbl_Model _modelItem;
    public tbl_Model ModelItem
    {
        get { return _modelItem; }
        private set
        {
            _modelItem = value;
            NotifyPropertyChanged("ModelItem");
        }
    }

    private ObservableCollection<tbl_Model> _modelCollection;
    public ObservableCollection<tbl_Model> ModelCollection
    {
        get { return _modelCollection; }
        private set
        {
            _modelCollection = value;
            NotifyPropertyChanged("ModelCollection");
        }
    }

    public void btn_update()
    {
       //Code to update at database 
       //what should i write here to update the list ?
    }

如图所示,列表显示型号。作为 101 即使我将其更新为 102

提前致谢

通过 Linq 自动生成的模型到 Sql

 public partial class tbl_Model : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _ID;

    private string _Model_No;

    private string _Name;

    private string _Manufacturer;

    private int _IsDelete;

#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnIDChanging(int value);
partial void OnIDChanged();
partial void OnModel_NoChanging(string value);
partial void OnModel_NoChanged();
partial void OnNameChanging(string value);
partial void OnNameChanged();
partial void OnManufacturerChanging(string value);
partial void OnManufacturerChanged();
partial void OnIsDeleteChanging(int value);
partial void OnIsDeleteChanged();
#endregion

    public tbl_Model()
    {
        OnCreated();
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int ID
    {
        get
        {
            return this._ID;
        }
        set
        {
            if ((this._ID != value))
            {
                this.OnIDChanging(value);
                this.SendPropertyChanging();
                this._ID = value;
                this.SendPropertyChanged("ID");
                this.OnIDChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Model_No", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
    public string Model_No
    {
        get
        {
            return this._Model_No;
        }
        set
        {
            if ((this._Model_No != value))
            {
                this.OnModel_NoChanging(value);
                this.SendPropertyChanging();
                this._Model_No = value;
                this.SendPropertyChanged("Model_No");
                this.OnModel_NoChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
    public string Name
    {
        get
        {
            return this._Name;
        }
        set
        {
            if ((this._Name != value))
            {
                this.OnNameChanging(value);
                this.SendPropertyChanging();
                this._Name = value;
                this.SendPropertyChanged("Name");
                this.OnNameChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Manufacturer", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
    public string Manufacturer
    {
        get
        {
            return this._Manufacturer;
        }
        set
        {
            if ((this._Manufacturer != value))
            {
                this.OnManufacturerChanging(value);
                this.SendPropertyChanging();
                this._Manufacturer = value;
                this.SendPropertyChanged("Manufacturer");
                this.OnManufacturerChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IsDelete", DbType="Int NOT NULL")]
    public int IsDelete
    {
        get
        {
            return this._IsDelete;
        }
        set
        {
            if ((this._IsDelete != value))
            {
                this.OnIsDeleteChanging(value);
                this.SendPropertyChanging();
                this._IsDelete = value;
                this.SendPropertyChanged("IsDelete");
                this.OnIsDeleteChanged();
            }
        }
    }

    public event PropertyChangingEventHandler PropertyChanging;

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanging()
    {
        if ((this.PropertyChanging != null))
        {
            this.PropertyChanging(this, emptyChangingEventArgs);
        }
    }

    protected virtual void SendPropertyChanged(String propertyName)
    {
        if ((this.PropertyChanged != null))
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ListViewXAML代码

<ListView ItemsSource="{Binding ModelCollection,Mode=TwoWay}" SelectedItem="{Binding SelectedModelItem}" Style="{StaticResource viewinglist}">                      
                    <ListView.View>
                        <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding Model_No, Mode=TwoWay}" Header="Model No." Width="100"/>
                            <GridViewColumn DisplayMemberBinding="{Binding Name, Mode=TwoWay}" Header="Model Name"  Width="200"/>
                            <GridViewColumn DisplayMemberBinding="{Binding Manufacturer, Mode=TwoWay}" Header="Manufacturer"  Width="200"/>
                        </GridView>
                    </ListView.View>
                </ListView>

任何看到 post 的人的解决方案:

这是我做错的地方-: public tbl_Model SelectedModelItem {get;设置;}

 //on clicking edit this is what i used to do
  ModelItem.ID = SelectedModelItem.ID;
  ModelItem.Model_No = SelectedModelItem.Model_No;
  ModelItem.Name = SelectedModelItem.Name;
  ModelItem.Manufacturer = SelectedModelItem.Manufacturer;

正确的方法:

  private tbl_Model _selectedModelItem;
    public tbl_Model SelectedModelItem 
    {
        get { return _selectedModelItem; }
        set
        {
            _selectedModelItem = value;
            NotifyPropertyChanged("SelectedModelItem");
        } 
    }


   on clicking edit

   ModelItem = SelectedModelItem;

ModelItem的属性也需要实现INotifyPropertyChanged

您必须在模型中实施 INotifyPropertyChanged。

如果您的模型是自动生成的,那么您可以为您的模型创建一个实现 INotifyPropertyChanged 的​​ ViewModel。

您的模型或视图模型的每个 属性 需要产生 属性 已更改。

ObservableCollection 会自动引发事件,但对于 ModelItem 的属性,您必须自己引发事件。

public class ModelItem : INotifyPropertyChanged
{

  private int modelNumber;
  public int ModelNumber
  {
    get { return modelNumber; }
    set 
    {

      modelNumber = value; 
      NotifyPropertyChanged("ModelNumber"); }
    }

  //Similar implementation for other Properties Model Name, Manufacturer

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (null != handler)
      {
        handler(this, new PropertyChangedEventArgs(propertyName));
      }
    }
}

您确定要在 您的 Collection 中更新 ModelItem 吗?你没有 post 代码。

绑定和 INotifyPropertyChanged 实现看起来不错。

<ListView ItemsSource="{Binding ModelCollection,Mode=TwoWay}" 
          SelectedItem="{Binding SelectedModelItem}" />


private tbl_Model _modelItem;
public tbl_Model SelectedModelItem 
{
    get { return _modelItem; }
    private set
    {
        _modelItem = value;
        NotifyPropertyChanged("SelectedModelItem");
    }
}

public void Update()
{
   SelectedModelItem.Model_No = "102";//Ui get notified, cause its a ModelItem from your Collection
}

ps:并请从

中删除双向绑定
<ListView ItemsSource="{Binding ModelCollection,Mode=TwoWay}"

您的 ListeView 永远不会将模型Collection设置回您的视图模型。