【问题标题】:WPF- How to update the changes in list item of a listWPF-如何更新列表的列表项中的更改
【发布时间】:2016-06-09 19:03:12
【问题描述】:

我已更新列表的列表项。该项目已在源即数据库中成功更新,但列表未使用更新的项目更新。我已将 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 ?
    }

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

提前致谢

通过 Linq to 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));
        }
    }
}

ListView XAML 代码

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

任何看到帖子的人的解决方案:

这是我做错的地方-: 公共 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;

【问题讨论】:

  • 您的tbl_Model 是什么样的?就像您编辑模型上的值一样,模型本身需要引发PropertyChangedEvent
  • 您是否为model no 实施了INotifyPropertyChanged 属性?你没有在代码中显示出来。实际的 XAML 也有助于检查绑定。
  • 检查绑定模式是否也是双向的。

标签: c# wpf observablecollection objectlistview


【解决方案1】:

您确定从 WITHIN 您的收藏中更新了 ModelItem 吗?你没有发布代码。

绑定和 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 永远不会将 ModelCollection 设置回您的 Viewmodel。

【讨论】:

  • 我没有得到你。我应该发布哪部分代码?
  • btn_update() 代码。您必须从您的收藏中更改 ModelItem,否则您的 UI 中不会显示任何通知。
  • 所选项目绑定到 SelectedModel。所以当用户选择一个项目并单击编辑时,我将所选模型的项目移动到 modelItem 像这样 ModelItem.ID = SelectedModelItem.ID; ModelItem.Model_No = SelectedModelItem.Model_No; ModelItem.Name = SelectedModelItem.Name; ModelItem.Manufacturer = SelectedModelItem.Manufacturer;
  • 我没有在您的视图模型中看到 SelectedModelItem 属性。但是你必须对你的 Collection 中的 ModelItem 进行更改。
  • 嘿,谢谢它的工作。 SelectedModelItem 属性是问题。再次感谢
【解决方案2】:

ModelItem的属性也需要实现INotifyPropertyChanged

【讨论】:

    【解决方案3】:

    您必须在模型中实现 INotifyPropertyChanged。

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

    你的 Model 或 ViewModel 的每个属性都需要让属性发生变化。

    【讨论】:

      【解决方案4】:

      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));
            }
          }
      }
      

      【讨论】:

      • 我使用 Linq to sql 自动生成 tbl_Model 模型。我检查了它已经实现的文件
      • 我已经用模型实现更新了问题
      • 你能发布你如何将列表 DataBound 到 Control 吗?是双向模式吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多