首页 > 解决方案 > 对动态列表的更改不会导致我的 UI 刷新和呈现

问题描述

我正在将新节点/成员添加到名为 People 的 BindableCollection 列表中,但在我的 UI 中看不到结果

我在 WPF 项目中使用 Caliburn.Micro 和 MongoDB 来了解它是如何工作的。当我将一个新人添加到我的列表中时,我会在 DB 表中看到,但我的表单不会自动更新。我在网上看到了一些关于 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);
        }
    }

}

太感谢了。

2019 年 5 月 21 日更新 - 这是我尝试更改人物收藏时看到的内容:在此处输入图像描述

标签: c#.netwpfcaliburn.micro

解决方案


推荐阅读