2013-09-04 3 views
0

Мое привязку в ночное время не работает, как я ожидаю.Сила привязки не то, что я хочу

Когда я нажимаю кнопку, чтобы добавить нового «человека», он не добавляет вновь введенного человека в список, пока я не закрою его и не перезапущу приложение (поэтому значение добавляется к БД только не к UI)

Что я делаю неправильно? У меня есть INotifyPropertyChanged, у меня есть ObservableCollection ... Что мне не хватает?

У меня есть модель:

public class Person : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private string _personName; 
     private string _personEmail; 
     private string _personPhone; 
     private DateTime _personDOB; 

     [PrimaryKey, AutoIncrement] 
     public int personId { get; set; } 
     [MaxLength(25)] 
     public string personName { 
      get { return _personName; } 
      set 
      { 
       _personName = value; 
       OnPropertyChanged("personName"); 
      } 
     } 
     [MaxLength(50)] 
     public string personEmail { 
      get { return _personEmail; } 
      set 
      { 
       _personEmail = value; 
       OnPropertyChanged("personEmail"); 
      } 
     } 

     [MaxLength(13)] 
     public string personPhone { 
      get { return _personPhone; } 
      set 
      { 
       _personPhone = value; 
       OnPropertyChanged("personPhone"); 
      } 
     } 
     public DateTime personDOB { 
      get { return _personDOB;} 
      set 
      { 
       _personDOB = value; 
       OnPropertyChanged("personDOB"); 
      } 
     } 
     public Boolean isPersonActive { get; set; } 

     public string Summary 
     { 
      get { return string.Format("{0} - {1} : {2} -- {3}", personName, personEmail, personPhone, personDOB); } 
     } 

     // Create the OnPropertyChanged method to raise the event 
     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 

В моем ViewModel я это:

public class ChoresVM 
{ 
    private ObservableCollection<win8Chores.Model.databaseTables.Person> _personList; 
    public ObservableCollection<win8Chores.Model.databaseTables.Person> personList 
    { 
     get { return _personList; } 
     set { _personList = value; } 
    } 

...

public ObservableCollection<win8Chores.Model.databaseTables.Person> selectAllPerson() 
    { 
     using (var db = new SQLiteConnection(dbPath)) 
     { 
      ObservableCollection<win8Chores.Model.databaseTables.Person> pList = new ObservableCollection<win8Chores.Model.databaseTables.Person>(db.Query<win8Chores.Model.databaseTables.Person>("select personId,personName,personEmail,personDOB from Person")); 
      _personList = new ObservableCollection<Model.databaseTables.Person>(db.Query<win8Chores.Model.databaseTables.Person>("select personId,personName,personEmail,personDOB from Person")); 
      return _personList; 
     } 
    } 

    public void insertPerson(string name, string email, string phone, DateTime dob, Boolean isActive = true) 
    { 
     dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "myDB"); 
     db = new SQLiteConnection(dbPath); 
     using (db) 
     { 
      var p = db.Insert(new win8Chores.Model.databaseTables.Person() 
      { 
       personName = name, 
       personEmail = email, 
       personPhone = phone, 
       personDOB = dob, 
       isPersonActive = isActive 

      }); 
     } 
     selectAllPerson(); 
    } 

Тогда на мой взгляд:

public MainPage() 
    { 
     this.InitializeComponent(); 
     VM = new ViewModel.ChoresVM(); 
     DataContext = VM; 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     DateTime myDOB = new DateTime(1955, 02, 28); 
     VM.insertPerson("test","[email protected]","123-456-7890", myDOB); 
    } 

С моим XAML, как это:

<ListView HorizontalAlignment="Left" Height="224" Margin="287,344,0,0" VerticalAlignment="Top" Width="740" x:Name="test" DisplayMemberPath="Summary" ItemsSource="{Binding personList, Mode=OneWay}" /> 

ответ

1

Try реализации INotifyPropertyChanged на ChoresVM и поднять PropertyChanged ("personList") при инициализации коллекции (в selectAllPerson() или personList сеттер). Этот способ привязки itemssource будет уведомлен, что свойство коллекции было изменено и будет собирать новую коллекцию. Также у вас есть опечатка. В Binding у вас есть «PersonList» (случай Паскаля), но вы находитесь в верблюжьем футляре (personList)

+0

Итак, я думаю, что исходной ошибкой было то, что «PersonList» был ошибочным. Когда я исправил, что мне больше не нужно устанавливать itemssource. Тем не менее, я обновил свой вопрос, чтобы обратиться к кнопке «Добавить». Есть идеи? – webdad3

+1

Когда вы вставляете нового человека, вы вызываете selectAllPerson(), который повторно инициализирует свойство personList. Опять же, вам нужно реализовать INotifyPropertyChange и повысить OnPropertyChanged ("personList"). – Nikolay

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