保存后立即更新ListBox集合

时间:2014-01-09 10:22:50

标签: c# .net wpf

我有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}">

但是没有任何变化,保存数据后列表框保持不变。

1 个答案:

答案 0 :(得分:1)

如果您希望在编辑ListBoxItem控件中的字段时更新AddEditData的属性,那么您还需要在类的INotifyPropertyChanged上实现Books接口。 UpdateSourceTrigger=Explicit集合中的项目。

如果您希望它们仅在保存后进行更新,则您需要将Binding添加到AddEditData控件中的所有Binding并在之后手动更新保存...这有点痛苦,因为您需要依次访问每个BindingExpression bindingExpression = someTextBox.GetBindingExpression(TextBox.TextProperty); bindingExpression.UpdateSource(); 来更新值:

UpdateSourceTrigger=PropertyChanged

或者,如果您向所有Binding添加{{1}},则项目中的字段会在编辑后立即更新。