Изменения в динамическом списке не приводят к обновлению и визуализации моего пользовательского интерфейса. - PullRequest
0 голосов
/ 20 мая 2019

Я добавляю новые узлы / элементы в список BindableCollection под названием People, но я не вижу результата в моем пользовательском интерфейсе

Я использую Caliburn.Micro и MongoDB в проекте WPF, чтобы узнать, как он работает. Когда я добавляю нового человека в свой список, я вижу в таблице БД, но моя форма не обновляется автоматически. Я видел в Интернете некоторые ссылки на элемент управления DataGrid, который не может быть хорошим выбором для динамического рендеринга в реальном времени, и я читаю все, что могу найти по теме, но не понял, что я делаю неправильно.

<DataGrid x:Name="People" AlternatingRowBackground="AliceBlue"
              CanUserAddRows="False" AutoGenerateColumns="False" Grid.ColumnSpan="4" ItemsSource="{Binding People}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="FullName"  Binding="{Binding Path=FullName}" />
            <!--<DataGridComboBoxColumn Header="FullName" Binding ="{Binding Path=FullName}"/>-->
            <DataGridCheckBoxColumn Header="Is Alive" Binding="{Binding Path=IsAlive}" />
            <DataGridTemplateColumn Header="Primary Address">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=PrimaryAddress.FullAddress}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=Addresses}" SelectedItem="{Binding Path=PrimaryAddress}">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=FullAddress}"/>
                                </DataTemplate>

                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DateOfBirth, StringFormat=d}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding Path=DateOfBirth}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Мне нравится видеть изменения в списке людей в режиме реального времени. Мой ShellView.xaml.cs имеет:

public partial class ShellView : Window
{
    MongoCRUD da = new MongoCRUD("mongoChallenge");
    PersonModel newPerson = new PersonModel();

    public ShellView()
    {
        InitializeComponent();   
    }

    private void NewPerson_Click(object sender, RoutedEventArgs e)
    {

        newPerson.FirstName = firstName.Text;
        newPerson.LastName = lastName.Text;
        //List<PersonModel> People = new List<PersonModel>();
        AddressModel newAddress = new AddressModel();
        newAddress.StreetAddress = StreetAddress.Text;
        newAddress.City = City.Text;
        newAddress.State = State.Text;
        newAddress.ZipCode = ZipCode.Text;
        newPerson.PrimaryAddress = newAddress;
        da.InsertRecord<PersonModel>("challengeUsers", newPerson);
        List<PersonModel> updatedList = new List<PersonModel>();
        updatedList = da.LoadRecords<PersonModel>("challengeUsers");      
    }

    private void Clear_Click(object sender, RoutedEventArgs e)
    {
        firstName.Text = "";
        lastName.Text = "";
        StreetAddress.Text = "";
        City.Text = "";
        State.Text = "";
        ZipCode.Text = "";
        DateOfBirth.SelectedDate = new DateTime();

        //dateOfBirth.DisplayDate = DateTime.Today;
        //dateOfBirth.ClearValue(); Not sure how to reset the date of birth when I clear the form
    }

    private void DateOfBirth_SelectedDateChanged_1(object sender, SelectionChangedEventArgs e)
    {
        newPerson.DateOfBirth = (DateTime)DateOfBirth.SelectedDate;

    }
}

И мой ShellViewModel.cs имеет:

public class ShellViewModel: Screen
{

    MongoCRUD da = new MongoCRUD("mongoChallenge");
    BindableCollection<PersonModel> testList = new BindableCollection<PersonModel>();
    private BindableCollection<PersonModel> _people;
    private AddressModel _primaryAddress;
    private PersonModel _newPerson;

    public PersonModel NewPerson
    {
        get { return _newPerson; }
        set
        {
            _newPerson = value;
            NotifyOfPropertyChange(() => NewPerson);
        }
    }
    public void Update (List<PersonModel> list)
    {
        //People = list;
        People.AddRange(list);
    }
    public BindableCollection<PersonModel> People
    {
        get
        {
            //load records from MongoDB table called challengeUsers
            List<PersonModel> temp = da.LoadRecords<PersonModel>("challengeUsers");
            _people = new BindableCollection<PersonModel>(temp);
            return _people;
        }
        set
        {

            //load records from MongoDB table called challengeUsers
            List<PersonModel> temp = da.LoadRecords<PersonModel>("challengeUsers");
            _people = new BindableCollection<PersonModel>(temp);
            NotifyOfPropertyChange(() => People);
        }
    }
    private DateTime _dateOfBirth;

    public DateTime DateOfBirth
    {
        get { return _dateOfBirth; }
        set
        {
            _dateOfBirth = value;
            NotifyOfPropertyChange<DateTime>(() => DateOfBirth);
        }
    }
    public ShellViewModel()
    {
        MongoCRUD da = new MongoCRUD("mongoChallenge");
        NotifyOfPropertyChange(() => NewPerson);
        List<PersonModel> temp = da.LoadRecords<PersonModel>("challengeUsers");
        People = new BindableCollection<PersonModel>(temp);
        NotifyOfPropertyChange(() => People);
    }
    private String _fullName;

    public String FullName
    {
        get { return _fullName; }
        set
        {
            _fullName = value;
            //FullName changed
            NotifyOfPropertyChange(() => FullName);
        }
    }


    public AddressModel PrimaryAddress
    {
        get { return _primaryAddress; }
        set
        {
            //Primary Address changed
            _primaryAddress = value;
            NotifyOfPropertyChange(() => PrimaryAddress);
        }
    }

}

Большое спасибо.

Обновление от 21.05.19. Вот что я вижу, когда пытаюсь изменить коллекцию людей: введите описание изображения здесь

...