使用实体模型时刷新数据绑定

时间:2011-09-26 16:54:10

标签: c# wpf xaml data-binding

我有一个列表框,它是实体框架中的一个集合的数据绑定。 当使用另一个窗口添加新对象时,我需要找到一种在主窗口中更新此列表框的方法。我在实体模型中看到,有

 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;
        }
    }

1 个答案:

答案 0 :(得分:2)

看起来您使用List<Game>作为支持集合。在WPF中,如果您希望在集合中添加或删除项目时收到通知,请改为使用ObservableCollection<Game>MSDN documentation here)。现在,也就是说,应该注意只观看添加/删除事件。没有关于集合中持有的各个对象的通知。因此,例如,如果属性在集合(例如,分数)属性中保存的Game对象上发生更改,则不会通知您的UI。如果您想要这种行为,可以对ObservableCollection进行子类化以添加此行为。

ObservableCollection使用INotifyCollectionChangedMSDN 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) { }
}