0

一方向バインディングが期待どおりに機能しません。

ボタンをクリックして新しい「人」を追加すると、アプリケーションをシャットダウンして再起動するまで、新しく入力した人がリストビューに追加されません(したがって、値はUIではなくDBに追加されます)

私は間違って何をしていますか? 私は 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 を実装し、(selectAllPerson() または personList セッターで) コレクションを初期化するときに PropertyChanged("personList") を発生させてみてください。このようにして、コレクション プロパティが変更され、新しいコレクションが取得されることが itemssource バインディングに通知されます。また、タイプミスがあります。Binding には "PersonList" (Pascal ケース) がありますが、プロパティはキャメル ケース (personList) です。

于 2013-09-04T04:21:18.847 に答える