2014-01-09 44 views
0

我有MainWindow和用戶控件AddEditData。兩者都使用它自己的視圖模型表示 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

'AddEditViewModel'如何初始化,如果保存,您修改初始'Book'對象,並且'Book'類實現'INotifyPropertyChanged',那麼更改應該立即可見。 –

回答

1

如果你想要當AddEditData控制的字段編輯ListBoxItem的性能更新,那麼你還需要實現類上的Books集合裏面的物品的INotifyPropertyChanged接口。

如果你希望他們只更新後保存,那麼你就需要在AddEditData控制後添加UpdateSourceTrigger=Explicit到所有Binding S和手動更新它們保存...這是一個有點痛,因爲你需要逐一接入各家Binding依次更新值:

BindingExpression bindingExpression = 
    someTextBox.GetBindingExpression(TextBox.TextProperty); 
bindingExpression.UpdateSource(); 

另外,如果添加UpdateSourceTrigger=PropertyChanged所有的Binding S的,然後在項目中的字段將盡快爲他們進行編輯更新。

+0

感謝您的時間,我更新了問題。請檢查。我用updatesourcetrigger更新了listbox,但問題仍然存在。 – user1765862

+0

你是否實現了'INotifyPropertyChanged'接口? – Sheridan

+0

書籍收藏有OnPropertyChanged(「書籍」);我是否還需要在Book域類上實現? – user1765862