我有MainWindow和用户控件AddEditData。两者都使用它自己的viewmodel表示 MainWindowViewModel和AddEditViewModel。
在左侧,我有列表框,其中包含数据项列表,右侧是AddEditView,它显示在列表框中选择的数据详细信息。在AddEdit上我有按钮保存,它保存文本框中的数据。
在引擎盖下一切正常,数据被正确保存在数据库中,但是数据细节的更改立即不可见,更改在下一个应用程序中可见。执行。
我知道INotifyPropertyChanged,我首先在我的列表框数据集上实现。这是代码
MainWindowViewModel
public ObservableCollection<Book> Books
{
get { return books; }
set {
books = value;
OnPropertyChanged("Books");
}
}
MainWindow.xaml
<ListBox Name="listBoxData"
DataContext="{Binding Source={StaticResource MainWindowViewModelDataSource}}"
ItemTemplate="{DynamicResource BookTemplate}"
ItemsSource="{Binding Books}"
SelectedItem="{Binding SelectedBook, Mode=TwoWay}">
在AddEditViewModel上,我添加了命令保存按钮,该按钮将数据保存到数据库,并使用Mediator模式向MainWindow发送消息以通知数据已保存。
Repository.Save(book);
Mediator.NotifyColleagues("SaveData", book);
同样,如何在保存操作后立即更新列表框项目?
更新 我已将UpdateSourceTrigger添加到PropertyChanged
<ListBox Name="listBoxData"
DataContext="{Binding Source={StaticResource MainWindowViewModelDataSource}}"
ItemTemplate="{DynamicResource BookTemplate}"
ItemsSource="{Binding Books, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedBook, Mode=TwoWay}">
但是没有任何变化,保存数据后列表框保持不变。
答案 0 :(得分:1)
如果您希望在编辑ListBoxItem
控件中的字段时更新AddEditData
的属性,那么您还需要在类的INotifyPropertyChanged
上实现Books
接口。 UpdateSourceTrigger=Explicit
集合中的项目。
如果您希望它们仅在保存后进行更新,则您需要将Binding
添加到AddEditData
控件中的所有Binding
并在之后手动更新保存...这有点痛苦,因为您需要依次访问每个BindingExpression bindingExpression =
someTextBox.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();
来更新值:
UpdateSourceTrigger=PropertyChanged
或者,如果您向所有Binding
添加{{1}},则项目中的字段会在编辑后立即更新。