2016-02-26 4 views
1

Я обновил список элементов списка. Элемент успешно обновлен в источнике, т.е. базе данных, но список не обновляется обновленным элементом. Я использовал Интерфейс INotifyPropertyChanged для элементов списка, а список привязан к наблюдаемой коллекции.WPF- Как обновить изменения в элементе списка списка

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

This is the image of the window of 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)); 
     } 
    } 
} 

элемент управления 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> 

решение для тех, кто видит сообщение:

Вот где я делал не так: 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; 
+0

Как выглядит ваш 'tbl_Model'? Как будто вы редактируете значения в модели, сама модель должна поднять «PropertyChangedEvent». –

+0

У вас есть свойство 'INotifyPropertyChanged', реализованное для' model no'? Вы не указали это в коде. Фактический XAML также поможет проверить привязки. – icebat

+0

Проверьте, подходит ли режим связывания TwoWay. – Divisadero

ответ

1

вы действительно уверены, что вы обновляете 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 
} 

пс: и пожалуйста удалить TwoWay Binding из

<ListView ItemsSource="{Binding ModelCollection,Mode=TwoWay}" 

ваш ListeView никогда не установит ModelCollection обратно в ViewModel.

+0

Я не получаю вас. Которая часть кода должна я отправить? –

+0

btn_update(). вы должны изменить ModelItem из своей коллекции, иначе уведомления не появятся в вашем пользовательском интерфейсе. – blindmeis

+0

Выбранный элемент привязан к SelectedModel.So, когда пользователь выбирает элемент и редактирует клики, я перемещаю элементы выбранной модели в modelItem, как этот ModelItem.ID = SelectedModelItem.ID; ModelItem.Model_No = SelectedModelItem.Model_No; ModelItem.Name = SelectedModelItem.Name; ModelItem.Manufacturer = SelectedModelItem.Manufacturer; –

0

Свойства ModelItem также необходимо реализовать INotifyPropertyChanged.

0

Вам необходимо реализовать INotifyPropertyChanged в вашей модели.

В случае, если ваша модель сгенерирована автоматически, вы можете создать ViewModel для своей модели, которая реализует INotifyPropertyChanged.

Каждое свойство вашей модели или ViewModel должно изменить свойство.

0

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

Я использовал Linq для sql для автоматической генерации модели tbl_Model.я chcecked, что файл он уже реализовал это –

+0

Я обновил вопрос с реализацией модели –

+0

Можете ли вы опубликовать, как у вас есть DataBound список для элемента управления? это режим Twoway? – abhilash

Смежные вопросы