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","test@live.com","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}" />
4

1 回答 1

1

尝试在 ChoresVM 上实现 INotifyPropertyChanged 并在初始化集合时引发 PropertyChanged("personList")(在 selectAllPerson() 或 personList setter 中)。这种方式将通知 itemssource 绑定,该集合属性已更改并将拾取新集合。你也有错别字。在绑定中,您有“PersonList”(Pascal 案例),但您的属性是骆驼案例(personList)

于 2013-09-04T04:21:18.847 回答