c# - 对动态列表的更改不会导致我的 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 日更新 - 这是我尝试更改人物收藏时看到的内容:在此处输入图像描述
解决方案
推荐阅读
- sql-server - 当备份文件的db名称与数据库不匹配时,获取SQL Server数据库的最后备份日期
- android - Android P 预览版 toast View 的 IllegalStateException
- javascript - 如何在 React 无状态功能组件中测试道具?
- php - 如何使用 symfony/doctrine 即时创建日期字段
- javascript - 将通过表单字段接收的项目排列到网格中
- java - 针对两个不同的注入依赖项运行单元测试
- windows - VueJs 3 & Docker & Windows - Webpack watchOptions 似乎不起作用
- vue.js - 在 v-for 中渲染 vuechart
- jquery-ui - 使用 jquery-ui 同时调整两个 div 的大小
- eclipse - 如何在eclipse Photon中支持es6