I have a list box that is databound to a collection from the entity frame work. I need to find a way to update this listbox in the main window when a new object is added using another window. I see in the entity model, there is
protected override sealed void ReportPropertyChanging(string property);
but i don't know how to use this, or even if this is what it is for.
Here is my Main Window 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();
}
}
here is the list box xaml
<ListBox ItemsSource="{Binding}" Name="GameList"></ListBox>
And Finally Here is the code from another window that inserts 开发者_运维知识库a new Game into the Entity.
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) { }
}
I just need that listBox to refresh when ever anything is added to or changed in the entity. Thanks!
UPDATE: Here is what I have based on the posts, it still is not working
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;
}
}
looks like you are using a List<Game>
as your backing collection. In WPF, if you want notifications when the collection has items added or removed, use ObservableCollection<Game>
instead (MSDN documentation here). Now, that said, it should be noted that only add/remove events are watched. There is NO notification on the individual objects that are being held in the collection. so, for example, if a property changes on your Game object that is held in the collection (say, a Score) property, your UI will NOT be notified. If you want this behavior, you can sub-class the ObservableCollection
to add this behavior.
the ObservableCollection uses INotifyCollectionChanged
(MSDN documentation here) interface, which the ListBox, ItemsControl, etc. respond to.
EDIT
ok, i see what is going on now... in addition to the changes above, and the changes to your getter, when you make a new game on the other window, it is getting added to the entity collection, but NOT to the observable collection. you need to add it to your observable collection. what you need to do to pass the OC to the child window is set ITS DataContext to your observable collection...
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) { }
}
精彩评论