我有一个列表框,它是实体框架中的一个集合的数据绑定。 当使用另一个窗口添加新对象时,我需要找到一种在主窗口中更新此列表框的方法。我在实体模型中看到,有
protected override sealed void ReportPropertyChanging(string property);
但我不知道如何使用它,或者即使这是它的用途。
这是我的主窗口C#
public partial class MainWindow : Window
{
List<Game> _GameColletion = new List<Game>();
GameDBEntities _entity = new GameDBEntities();
public MainWindow()
{
InitializeComponent();
_GameColletion = _entity.Games.ToList<Game>();
DataContext = _GameColletion;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var newWindow = new AddGame();
newWindow.Show();
}
}
这是列表框xaml
<ListBox ItemsSource="{Binding}" Name="GameList"></ListBox>
最后这是来自另一个窗口的代码,它将新游戏插入实体。
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
_newGame.Date = date.SelectedDate.Value;
_newGame.Time = time.Text;
MainWindow w = new MainWindow();
w._entity.AddToGames(_newGame);
w._entity.SaveChanges();
this.Close();
}
catch (Exception ex) { }
}
我只需要在实体中添加或更改任何内容时刷新listBox。 谢谢!
更新:以下是基于帖子的内容,它仍然无效
ObservableCollection<Game> _GameColletion;
GameDBEntities _entity = new GameDBEntities();
public MainWindow()
{
InitializeComponent();
DataContext = GameCollection;
}
public ObservableCollection<Game> GameCollection
{
get
{
if (_GameColletion == null)
{
_GameColletion = new ObservableCollection<Game>(_entity.Games.ToList<Game>());
}
return _GameColletion;
}
}
答案 0 :(得分:2)
看起来您使用List<Game>
作为支持集合。在WPF中,如果您希望在集合中添加或删除项目时收到通知,请改为使用ObservableCollection<Game>
(MSDN documentation here)。现在,也就是说,应该注意只观看添加/删除事件。没有关于集合中持有的各个对象的通知。因此,例如,如果属性在集合(例如,分数)属性中保存的Game对象上发生更改,则不会通知您的UI。如果您想要这种行为,可以对ObservableCollection
进行子类化以添加此行为。
ObservableCollection使用INotifyCollectionChanged
(MSDN documentation here)接口,ListBox,ItemsControl等响应。
修改强>
好吧,我看到现在发生了什么...除了上面的更改,以及对getter的更改,当你在另一个窗口上制作一个新游戏时,它会被添加到实体集合中,但是不是可观察的集合。你需要将它添加到你的可观察集合中。要将OC传递到子窗口,您需要做的是将ITS DataContext设置为您的可观察集合......private void Button_Click(object sender, RoutedEventArgs e)
{
var newWindow = new AddGame();
newWindow.DataContext = this.DataContext; // ----> new code to set the DC
newWindow.Show();
}
// in the other window...
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
_newGame.Date = date.SelectedDate.Value;
_newGame.Time = time.Text;
((ObservableCollection<Game>)DataContext).Add( _newGame ); // ----> new code
entity.AddToGames(_newGame);
entity.SaveChanges();
this.Close();
}
catch (Exception ex) { }
}