实体框架 - 绑定到datagrid

时间:2012-11-15 18:51:21

标签: c# wpf entity-framework mvvm

我有一个绑定到Players属性的数据网格:

 <DataGrid HorizontalAlignment="Left" SelectedItem="{Binding CurrentPlayer}" Height="374" Margin="121,22,0,0" RowHeaderWidth="0" VerticalAlignment="Top" Width="836" ItemsSource="{Binding Players}" AutoGenerateColumns="false" IsReadOnly="True" SelectionMode="Single" IsEnabled="{Binding Editing, Converter={StaticResource InverseBooleanConverter}}" Grid.RowSpan="2" Grid.ColumnSpan="2">

此Players属性的定义如下:

public List<Player> Players
{
    get { return repository.Players.OrderBy(x => x.Firstname).ToList(); }
}

存储库包含来自EF的DBSet。

当我添加播放器时,我使用此代码:

private void SaveExecute(object parameter)
{
    repository.SavePlayer(currentPlayer);
    Editing = false;
}

我现在想做的很简单:创建新玩家时,数据网格应该刷新。它与Players属性绑定,但从未使用过setter,因此无法调用RaisePropertyChange。

我被困在这里。如何正确绑定它,以便在调用SavePlayer()方法时,datagrid会更新,从而显示新的播放器?

我发现的最简单的解决方案是调用RaisePropertyChanged(“玩家”);在SaveExecute()方法中:

private void SaveExecute(object parameter)
{
    repository.SavePlayer(currentPlayer);
    RaisePropertyChanged("Players");
    Editing = false;
}

但......这是允许的,还是这个你不该做的事情?如果您只在属性的设置者中调用RaiseProperyChanged,那也可以吗?

由于

2 个答案:

答案 0 :(得分:1)

更改List<Player>的{​​{1}}。这是一种特殊类型的集合,具有在添加/删除项目时通知的事件。 WPF会自动处理这些事件并相应地更新UI。

然后在ObservableCollection<Player>中,只需Save(),您就会看到用户界面中反映的更改。

答案 1 :(得分:0)

要回答您的问题,从您的保存执行方法中调用RaisePropertyChanged或在您需要让UI知道某些内容已发生变化的任何其他地方,这是完全合法的。

这是最好的方法吗?可能不是,就个人而言,我会考虑使用MVVM模式。但话说回来,如果它适合你,那么它就没有错。

相关问题