我有一个绑定到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,那也可以吗?
由于
答案 0 :(得分:1)
更改List<Player>
的{{1}}。这是一种特殊类型的集合,具有在添加/删除项目时通知的事件。 WPF会自动处理这些事件并相应地更新UI。
然后在ObservableCollection<Player>
中,只需Save()
,您就会看到用户界面中反映的更改。
答案 1 :(得分:0)
要回答您的问题,从您的保存执行方法中调用RaisePropertyChanged
或在您需要让UI知道某些内容已发生变化的任何其他地方,这是完全合法的。
这是最好的方法吗?可能不是,就个人而言,我会考虑使用MVVM模式。但话说回来,如果它适合你,那么它就没有错。