C# 保存后立即更新列表框集合
我有主窗口和用户控制数据。两者都使用自己的viewmodel表示 MainWindowViewModel和AddEditViewModel 在左侧,我有一个包含数据项列表的列表框,在右侧,我有一个AddEditView,它显示在列表框上选择的数据详细信息。在AddEdit上,我有保存按钮,用于保存文本框中的数据 在引擎盖下,一切正常,数据被正确地保存在数据库中,但数据细节的更改不会立即可见,更改在下一个应用程序中可见。执行 我知道INotifyPropertyChanged,我首先在我的listbox数据收集上实现了它。这是密码 MainWindowViewModelC# 保存后立即更新列表框集合,c#,.net,wpf,C#,.net,Wpf,我有主窗口和用户控制数据。两者都使用自己的viewmodel表示 MainWindowViewModel和AddEditViewModel 在左侧,我有一个包含数据项列表的列表框,在右侧,我有一个AddEditView,它显示在列表框上选择的数据详细信息。在AddEdit上,我有保存按钮,用于保存文本框中的数据 在引擎盖下,一切正常,数据被正确地保存在数据库中,但数据细节的更改不会立即可见,更改在下一个应用程序中可见。执行 我知道INotifyPropertyChanged,我首先在我的list
public ObservableCollection<Book> Books
{
get { return books; }
set {
books = value;
OnPropertyChanged("Books");
}
}
<ListBox Name="listBoxData"
DataContext="{Binding Source={StaticResource MainWindowViewModelDataSource}}"
ItemTemplate="{DynamicResource BookTemplate}"
ItemsSource="{Binding Books}"
SelectedItem="{Binding SelectedBook, Mode=TwoWay}">
同样,如何在保存操作后立即更新列表框项
更新
我已将UpdateSourceRigger添加到PropertyChanged
<ListBox Name="listBoxData"
DataContext="{Binding Source={StaticResource MainWindowViewModelDataSource}}"
ItemTemplate="{DynamicResource BookTemplate}"
ItemsSource="{Binding Books, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedBook, Mode=TwoWay}">
但这不会改变,listbox在保存数据后保持不变。如果要在编辑
AddEditData
控件中的字段时更新ListBoxItem
的属性,然后,您还需要在书籍
集合中的项目类上实现INotifyPropertyChanged
接口
如果希望它们仅在保存后更新,则需要将UpdateSourceTrigger=Explicit
添加到AddEditData
控件中的所有绑定中,并在保存后手动更新它们。。。这有点麻烦,因为您需要依次访问每个绑定
,以更新值:
BindingExpression bindingExpression =
someTextBox.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();
或者,如果将UpdateSourceTrigger=PropertyChanged
添加到所有绑定中,则项目中的字段将在编辑后立即更新。如何初始化AddEditViewModel
,如果保存,您修改了初始的Book
对象,并且Book
类实现了INotifyPropertyChanged
更改应该立即可见。感谢您的时间,我已经更新了问题。请查收。我已经用updatesourcetrigger更新了listbox,但问题仍然存在。您是否实现了INotifyPropertyChanged
接口?Books集合的OnPropertyChanged(“Books”);我也需要在Book domain类上实现吗?正如我回答的第一行所说,如果您想在编辑AddEditData
控件中的字段时更新ListBoxItem
的属性,那么需要这样做。
BindingExpression bindingExpression =
someTextBox.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();